From 28458403bb6175a78710cb7f33f275cc5acf4024 Mon Sep 17 00:00:00 2001 From: c00lerxo Date: Tue, 11 Dec 2018 00:32:28 +0100 Subject: [PATCH] Prototype app --- __pycache__/cat_or_not.cpython-36.pyc | Bin 0 -> 146 bytes __pycache__/cat_recognition.cpython-36.pyc | Bin 0 -> 645 bytes __pycache__/config.cpython-36.pyc | Bin 0 -> 363 bytes __pycache__/forms.cpython-36.pyc | Bin 0 -> 567 bytes __pycache__/hello.cpython-36.pyc | Bin 0 -> 414 bytes app/__init__.py | 7 + app/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 275 bytes .../cat_recognition.cpython-36.pyc | Bin 0 -> 706 bytes app/__pycache__/forms.cpython-36.pyc | Bin 0 -> 571 bytes .../picture_downloader.cpython-36.pyc | Bin 0 -> 405 bytes app/__pycache__/routes.cpython-36.pyc | Bin 0 -> 690 bytes app/cat_recognition.py | 20 + app/forms.py | 7 + app/picture_downloader.py | 10 + app/routes.py | 18 + app/templates/base.html | 23 + app/templates/index.html | 13 + authentication.json | 12 + cat_or_not.py | 1 + config.py | 4 + pic.jpg | Bin 0 -> 6741 bytes venv/bin/activate | 76 + venv/bin/activate.csh | 37 + venv/bin/activate.fish | 75 + venv/bin/chardetect | 11 + venv/bin/easy_install | 11 + venv/bin/easy_install-3.6 | 11 + venv/bin/flask | 11 + venv/bin/pip | 11 + venv/bin/pip3 | 11 + venv/bin/pip3.6 | 11 + venv/bin/pyrsa-decrypt | 11 + venv/bin/pyrsa-encrypt | 11 + venv/bin/pyrsa-keygen | 11 + venv/bin/pyrsa-priv2pub | 11 + venv/bin/pyrsa-sign | 11 + venv/bin/pyrsa-verify | 11 + venv/bin/python | 1 + venv/bin/python3 | 1 + .../Click-7.0.dist-info/INSTALLER | 1 + .../Click-7.0.dist-info/LICENSE.txt | 39 + .../Click-7.0.dist-info/METADATA | 121 + .../site-packages/Click-7.0.dist-info/RECORD | 40 + .../site-packages/Click-7.0.dist-info/WHEEL | 6 + .../Click-7.0.dist-info/top_level.txt | 1 + .../Flask-1.0.2.dist-info/INSTALLER | 1 + .../Flask-1.0.2.dist-info/LICENSE.txt | 31 + .../Flask-1.0.2.dist-info/METADATA | 130 + .../Flask-1.0.2.dist-info/RECORD | 48 + .../site-packages/Flask-1.0.2.dist-info/WHEEL | 6 + .../Flask-1.0.2.dist-info/entry_points.txt | 3 + .../Flask-1.0.2.dist-info/top_level.txt | 1 + .../DESCRIPTION.rst | 21 + .../Flask_WTF-0.14.2.dist-info/INSTALLER | 1 + .../Flask_WTF-0.14.2.dist-info/LICENSE.txt | 32 + .../Flask_WTF-0.14.2.dist-info/METADATA | 52 + .../Flask_WTF-0.14.2.dist-info/RECORD | 30 + .../Flask_WTF-0.14.2.dist-info/WHEEL | 6 + .../Flask_WTF-0.14.2.dist-info/metadata.json | 1 + .../Flask_WTF-0.14.2.dist-info/top_level.txt | 1 + .../Jinja2-2.10.dist-info/DESCRIPTION.rst | 37 + .../Jinja2-2.10.dist-info/INSTALLER | 1 + .../Jinja2-2.10.dist-info/LICENSE.txt | 31 + .../Jinja2-2.10.dist-info/METADATA | 68 + .../Jinja2-2.10.dist-info/RECORD | 63 + .../site-packages/Jinja2-2.10.dist-info/WHEEL | 6 + .../Jinja2-2.10.dist-info/entry_points.txt | 4 + .../Jinja2-2.10.dist-info/metadata.json | 1 + .../Jinja2-2.10.dist-info/top_level.txt | 1 + .../MarkupSafe-1.1.0.dist-info/INSTALLER | 1 + .../MarkupSafe-1.1.0.dist-info/LICENSE.txt | 33 + .../MarkupSafe-1.1.0.dist-info/METADATA | 103 + .../MarkupSafe-1.1.0.dist-info/RECORD | 16 + .../MarkupSafe-1.1.0.dist-info/WHEEL | 5 + .../MarkupSafe-1.1.0.dist-info/top_level.txt | 1 + .../WTForms-2.2.1.dist-info/INSTALLER | 1 + .../WTForms-2.2.1.dist-info/METADATA | 101 + .../WTForms-2.2.1.dist-info/RECORD | 147 + .../WTForms-2.2.1.dist-info/WHEEL | 6 + .../WTForms-2.2.1.dist-info/top_level.txt | 1 + .../Werkzeug-0.14.1.dist-info/DESCRIPTION.rst | 80 + .../Werkzeug-0.14.1.dist-info/INSTALLER | 1 + .../Werkzeug-0.14.1.dist-info/LICENSE.txt | 31 + .../Werkzeug-0.14.1.dist-info/METADATA | 116 + .../Werkzeug-0.14.1.dist-info/RECORD | 97 + .../Werkzeug-0.14.1.dist-info/WHEEL | 6 + .../Werkzeug-0.14.1.dist-info/metadata.json | 1 + .../Werkzeug-0.14.1.dist-info/top_level.txt | 1 + .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 275 bytes .../__pycache__/six.cpython-36.pyc | Bin 0 -> 26448 bytes .../DESCRIPTION.rst | 97 + .../cachetools-3.0.0.dist-info/INSTALLER | 1 + .../cachetools-3.0.0.dist-info/METADATA | 124 + .../cachetools-3.0.0.dist-info/RECORD | 25 + .../cachetools-3.0.0.dist-info/WHEEL | 6 + .../cachetools-3.0.0.dist-info/metadata.json | 1 + .../cachetools-3.0.0.dist-info/top_level.txt | 1 + .../site-packages/cachetools/__init__.py | 112 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3162 bytes .../cachetools/__pycache__/abc.cpython-36.pyc | Bin 0 -> 1409 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 3274 bytes .../__pycache__/func.cpython-36.pyc | Bin 0 -> 4198 bytes .../__pycache__/keys.cpython-36.pyc | Bin 0 -> 1704 bytes .../cachetools/__pycache__/lfu.cpython-36.pyc | Bin 0 -> 1576 bytes .../cachetools/__pycache__/lru.cpython-36.pyc | Bin 0 -> 1949 bytes .../cachetools/__pycache__/rr.cpython-36.pyc | Bin 0 -> 1281 bytes .../cachetools/__pycache__/ttl.cpython-36.pyc | Bin 0 -> 7144 bytes .../python3.6/site-packages/cachetools/abc.py | 48 + .../site-packages/cachetools/cache.py | 91 + .../site-packages/cachetools/func.py | 136 + .../site-packages/cachetools/keys.py | 43 + .../python3.6/site-packages/cachetools/lfu.py | 35 + .../python3.6/site-packages/cachetools/lru.py | 48 + .../python3.6/site-packages/cachetools/rr.py | 36 + .../python3.6/site-packages/cachetools/ttl.py | 216 + .../DESCRIPTION.rst | 45 + .../certifi-2018.11.29.dist-info/INSTALLER | 1 + .../certifi-2018.11.29.dist-info/LICENSE.txt | 21 + .../certifi-2018.11.29.dist-info/METADATA | 69 + .../certifi-2018.11.29.dist-info/RECORD | 15 + .../certifi-2018.11.29.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../site-packages/certifi/__init__.py | 3 + .../site-packages/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 199 bytes .../__pycache__/__main__.cpython-36.pyc | Bin 0 -> 190 bytes .../certifi/__pycache__/core.cpython-36.pyc | Bin 0 -> 460 bytes .../site-packages/certifi/cacert.pem | 4512 +++++++++ .../python3.6/site-packages/certifi/core.py | 20 + .../chardet-3.0.4.dist-info/DESCRIPTION.rst | 70 + .../chardet-3.0.4.dist-info/INSTALLER | 1 + .../chardet-3.0.4.dist-info/METADATA | 96 + .../chardet-3.0.4.dist-info/RECORD | 91 + .../chardet-3.0.4.dist-info/WHEEL | 6 + .../chardet-3.0.4.dist-info/entry_points.txt | 3 + .../chardet-3.0.4.dist-info/metadata.json | 1 + .../chardet-3.0.4.dist-info/top_level.txt | 1 + .../site-packages/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 786 bytes .../__pycache__/big5freq.cpython-36.pyc | Bin 0 -> 54673 bytes .../__pycache__/big5prober.cpython-36.pyc | Bin 0 -> 1062 bytes .../chardistribution.cpython-36.pyc | Bin 0 -> 6258 bytes .../charsetgroupprober.cpython-36.pyc | Bin 0 -> 2169 bytes .../__pycache__/charsetprober.cpython-36.pyc | Bin 0 -> 3395 bytes .../codingstatemachine.cpython-36.pyc | Bin 0 -> 2826 bytes .../chardet/__pycache__/compat.cpython-36.pyc | Bin 0 -> 302 bytes .../__pycache__/cp949prober.cpython-36.pyc | Bin 0 -> 1069 bytes .../chardet/__pycache__/enums.cpython-36.pyc | Bin 0 -> 2560 bytes .../__pycache__/escprober.cpython-36.pyc | Bin 0 -> 2551 bytes .../chardet/__pycache__/escsm.cpython-36.pyc | Bin 0 -> 7308 bytes .../__pycache__/eucjpprober.cpython-36.pyc | Bin 0 -> 2355 bytes .../__pycache__/euckrfreq.cpython-36.pyc | Bin 0 -> 24059 bytes .../__pycache__/euckrprober.cpython-36.pyc | Bin 0 -> 1070 bytes .../__pycache__/euctwfreq.cpython-36.pyc | Bin 0 -> 54682 bytes .../__pycache__/euctwprober.cpython-36.pyc | Bin 0 -> 1070 bytes .../__pycache__/gb2312freq.cpython-36.pyc | Bin 0 -> 38324 bytes .../__pycache__/gb2312prober.cpython-36.pyc | Bin 0 -> 1078 bytes .../__pycache__/hebrewprober.cpython-36.pyc | Bin 0 -> 2912 bytes .../__pycache__/jisfreq.cpython-36.pyc | Bin 0 -> 44468 bytes .../chardet/__pycache__/jpcntx.cpython-36.pyc | Bin 0 -> 38607 bytes .../langbulgarianmodel.cpython-36.pyc | Bin 0 -> 24822 bytes .../langcyrillicmodel.cpython-36.pyc | Bin 0 -> 30373 bytes .../__pycache__/langgreekmodel.cpython-36.pyc | Bin 0 -> 24500 bytes .../langhebrewmodel.cpython-36.pyc | Bin 0 -> 23354 bytes .../langhungarianmodel.cpython-36.pyc | Bin 0 -> 24796 bytes .../__pycache__/langthaimodel.cpython-36.pyc | Bin 0 -> 23333 bytes .../langturkishmodel.cpython-36.pyc | Bin 0 -> 23351 bytes .../__pycache__/latin1prober.cpython-36.pyc | Bin 0 -> 2883 bytes .../mbcharsetprober.cpython-36.pyc | Bin 0 -> 2174 bytes .../mbcsgroupprober.cpython-36.pyc | Bin 0 -> 1065 bytes .../chardet/__pycache__/mbcssm.cpython-36.pyc | Bin 0 -> 17518 bytes .../sbcharsetprober.cpython-36.pyc | Bin 0 -> 2927 bytes .../sbcsgroupprober.cpython-36.pyc | Bin 0 -> 1555 bytes .../__pycache__/sjisprober.cpython-36.pyc | Bin 0 -> 2381 bytes .../universaldetector.cpython-36.pyc | Bin 0 -> 5776 bytes .../__pycache__/utf8prober.cpython-36.pyc | Bin 0 -> 1912 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 381 bytes .../site-packages/chardet/big5freq.py | 386 + .../site-packages/chardet/big5prober.py | 47 + .../site-packages/chardet/chardistribution.py | 233 + .../chardet/charsetgroupprober.py | 106 + .../site-packages/chardet/charsetprober.py | 145 + .../site-packages/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 138 bytes .../cli/__pycache__/chardetect.cpython-36.pyc | Bin 0 -> 3026 bytes .../site-packages/chardet/cli/chardetect.py | 85 + .../chardet/codingstatemachine.py | 88 + .../python3.6/site-packages/chardet/compat.py | 34 + .../site-packages/chardet/cp949prober.py | 49 + .../python3.6/site-packages/chardet/enums.py | 76 + .../site-packages/chardet/escprober.py | 101 + .../python3.6/site-packages/chardet/escsm.py | 246 + .../site-packages/chardet/eucjpprober.py | 92 + .../site-packages/chardet/euckrfreq.py | 195 + .../site-packages/chardet/euckrprober.py | 47 + .../site-packages/chardet/euctwfreq.py | 387 + .../site-packages/chardet/euctwprober.py | 46 + .../site-packages/chardet/gb2312freq.py | 283 + .../site-packages/chardet/gb2312prober.py | 46 + .../site-packages/chardet/hebrewprober.py | 292 + .../site-packages/chardet/jisfreq.py | 325 + .../python3.6/site-packages/chardet/jpcntx.py | 233 + .../chardet/langbulgarianmodel.py | 228 + .../chardet/langcyrillicmodel.py | 333 + .../site-packages/chardet/langgreekmodel.py | 225 + .../site-packages/chardet/langhebrewmodel.py | 200 + .../chardet/langhungarianmodel.py | 225 + .../site-packages/chardet/langthaimodel.py | 199 + .../site-packages/chardet/langturkishmodel.py | 193 + .../site-packages/chardet/latin1prober.py | 145 + .../site-packages/chardet/mbcharsetprober.py | 91 + .../site-packages/chardet/mbcsgroupprober.py | 54 + .../python3.6/site-packages/chardet/mbcssm.py | 572 ++ .../site-packages/chardet/sbcharsetprober.py | 132 + .../site-packages/chardet/sbcsgroupprober.py | 73 + .../site-packages/chardet/sjisprober.py | 92 + .../chardet/universaldetector.py | 286 + .../site-packages/chardet/utf8prober.py | 82 + .../site-packages/chardet/version.py | 9 + .../python3.6/site-packages/click/__init__.py | 97 + .../click/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2618 bytes .../__pycache__/_bashcomplete.cpython-36.pyc | Bin 0 -> 9076 bytes .../click/__pycache__/_compat.cpython-36.pyc | Bin 0 -> 16749 bytes .../__pycache__/_termui_impl.cpython-36.pyc | Bin 0 -> 13984 bytes .../__pycache__/_textwrap.cpython-36.pyc | Bin 0 -> 1297 bytes .../__pycache__/_unicodefun.cpython-36.pyc | Bin 0 -> 3329 bytes .../__pycache__/_winconsole.cpython-36.pyc | Bin 0 -> 8741 bytes .../click/__pycache__/core.cpython-36.pyc | Bin 0 -> 59865 bytes .../__pycache__/decorators.cpython-36.pyc | Bin 0 -> 11570 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 8572 bytes .../__pycache__/formatting.cpython-36.pyc | Bin 0 -> 8515 bytes .../click/__pycache__/globals.cpython-36.pyc | Bin 0 -> 1844 bytes .../click/__pycache__/parser.cpython-36.pyc | Bin 0 -> 11433 bytes .../click/__pycache__/termui.cpython-36.pyc | Bin 0 -> 20782 bytes .../click/__pycache__/testing.cpython-36.pyc | Bin 0 -> 11586 bytes .../click/__pycache__/types.cpython-36.pyc | Bin 0 -> 21829 bytes .../click/__pycache__/utils.cpython-36.pyc | Bin 0 -> 15210 bytes .../site-packages/click/_bashcomplete.py | 293 + .../python3.6/site-packages/click/_compat.py | 703 ++ .../site-packages/click/_termui_impl.py | 621 ++ .../site-packages/click/_textwrap.py | 38 + .../site-packages/click/_unicodefun.py | 125 + .../site-packages/click/_winconsole.py | 307 + .../lib/python3.6/site-packages/click/core.py | 1856 ++++ .../site-packages/click/decorators.py | 311 + .../site-packages/click/exceptions.py | 235 + .../site-packages/click/formatting.py | 256 + .../python3.6/site-packages/click/globals.py | 48 + .../python3.6/site-packages/click/parser.py | 427 + .../python3.6/site-packages/click/termui.py | 606 ++ .../python3.6/site-packages/click/testing.py | 374 + .../python3.6/site-packages/click/types.py | 668 ++ .../python3.6/site-packages/click/utils.py | 440 + .../python3.6/site-packages/easy_install.py | 5 + .../python3.6/site-packages/flask/__init__.py | 49 + .../python3.6/site-packages/flask/__main__.py | 14 + .../flask/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1792 bytes .../flask/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 419 bytes .../flask/__pycache__/_compat.cpython-36.pyc | Bin 0 -> 3191 bytes .../flask/__pycache__/app.cpython-36.pyc | Bin 0 -> 70866 bytes .../__pycache__/blueprints.cpython-36.pyc | Bin 0 -> 20455 bytes .../flask/__pycache__/cli.cpython-36.pyc | Bin 0 -> 24832 bytes .../flask/__pycache__/config.cpython-36.pyc | Bin 0 -> 9958 bytes .../flask/__pycache__/ctx.cpython-36.pyc | Bin 0 -> 13928 bytes .../__pycache__/debughelpers.cpython-36.pyc | Bin 0 -> 6567 bytes .../flask/__pycache__/globals.cpython-36.pyc | Bin 0 -> 1719 bytes .../flask/__pycache__/helpers.cpython-36.pyc | Bin 0 -> 33027 bytes .../flask/__pycache__/logging.cpython-36.pyc | Bin 0 -> 2348 bytes .../flask/__pycache__/sessions.cpython-36.pyc | Bin 0 -> 12195 bytes .../flask/__pycache__/signals.cpython-36.pyc | Bin 0 -> 2380 bytes .../__pycache__/templating.cpython-36.pyc | Bin 0 -> 4929 bytes .../flask/__pycache__/testing.cpython-36.pyc | Bin 0 -> 7832 bytes .../flask/__pycache__/views.cpython-36.pyc | Bin 0 -> 4737 bytes .../flask/__pycache__/wrappers.cpython-36.pyc | Bin 0 -> 6738 bytes .../python3.6/site-packages/flask/_compat.py | 99 + venv/lib/python3.6/site-packages/flask/app.py | 2315 +++++ .../site-packages/flask/blueprints.py | 448 + venv/lib/python3.6/site-packages/flask/cli.py | 898 ++ .../python3.6/site-packages/flask/config.py | 265 + venv/lib/python3.6/site-packages/flask/ctx.py | 457 + .../site-packages/flask/debughelpers.py | 168 + .../python3.6/site-packages/flask/globals.py | 61 + .../python3.6/site-packages/flask/helpers.py | 1044 +++ .../site-packages/flask/json/__init__.py | 327 + .../json/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 10238 bytes .../flask/json/__pycache__/tag.cpython-36.pyc | Bin 0 -> 11040 bytes .../python3.6/site-packages/flask/json/tag.py | 300 + .../python3.6/site-packages/flask/logging.py | 78 + .../python3.6/site-packages/flask/sessions.py | 385 + .../python3.6/site-packages/flask/signals.py | 57 + .../site-packages/flask/templating.py | 150 + .../python3.6/site-packages/flask/testing.py | 250 + .../python3.6/site-packages/flask/views.py | 158 + .../python3.6/site-packages/flask/wrappers.py | 216 + .../site-packages/flask_wtf/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 572 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1053 bytes .../flask_wtf/__pycache__/csrf.cpython-36.pyc | Bin 0 -> 11033 bytes .../flask_wtf/__pycache__/file.cpython-36.pyc | Bin 0 -> 3536 bytes .../flask_wtf/__pycache__/form.cpython-36.pyc | Bin 0 -> 5697 bytes .../__pycache__/html5.cpython-36.pyc | Bin 0 -> 459 bytes .../flask_wtf/__pycache__/i18n.cpython-36.pyc | Bin 0 -> 1735 bytes .../site-packages/flask_wtf/_compat.py | 35 + .../python3.6/site-packages/flask_wtf/csrf.py | 364 + .../python3.6/site-packages/flask_wtf/file.py | 94 + .../python3.6/site-packages/flask_wtf/form.py | 158 + .../site-packages/flask_wtf/html5.py | 13 + .../python3.6/site-packages/flask_wtf/i18n.py | 69 + .../flask_wtf/recaptcha/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 212 bytes .../__pycache__/fields.cpython-36.pyc | Bin 0 -> 753 bytes .../__pycache__/validators.cpython-36.pyc | Bin 0 -> 2325 bytes .../__pycache__/widgets.cpython-36.pyc | Bin 0 -> 1600 bytes .../flask_wtf/recaptcha/fields.py | 17 + .../flask_wtf/recaptcha/validators.py | 77 + .../flask_wtf/recaptcha/widgets.py | 42 + .../site-packages/google/api/__init__.py | 0 .../api/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 154 bytes .../annotations_pb2.cpython-36.pyc | Bin 0 -> 1891 bytes .../api/__pycache__/auth_pb2.cpython-36.pyc | Bin 0 -> 4986 bytes .../__pycache__/backend_pb2.cpython-36.pyc | Bin 0 -> 2762 bytes .../__pycache__/billing_pb2.cpython-36.pyc | Bin 0 -> 2813 bytes .../config_change_pb2.cpython-36.pyc | Bin 0 -> 3650 bytes .../__pycache__/consumer_pb2.cpython-36.pyc | Bin 0 -> 3233 bytes .../__pycache__/context_pb2.cpython-36.pyc | Bin 0 -> 2606 bytes .../__pycache__/control_pb2.cpython-36.pyc | Bin 0 -> 1990 bytes .../distribution_pb2.cpython-36.pyc | Bin 0 -> 6416 bytes .../documentation_pb2.cpython-36.pyc | Bin 0 -> 3906 bytes .../__pycache__/endpoint_pb2.cpython-36.pyc | Bin 0 -> 2603 bytes .../api/__pycache__/http_pb2.cpython-36.pyc | Bin 0 -> 4598 bytes .../__pycache__/httpbody_pb2.cpython-36.pyc | Bin 0 -> 2397 bytes .../api/__pycache__/label_pb2.cpython-36.pyc | Bin 0 -> 2762 bytes .../api/__pycache__/log_pb2.cpython-36.pyc | Bin 0 -> 2585 bytes .../__pycache__/logging_pb2.cpython-36.pyc | Bin 0 -> 3003 bytes .../api/__pycache__/metric_pb2.cpython-36.pyc | Bin 0 -> 5224 bytes .../monitored_resource_pb2.cpython-36.pyc | Bin 0 -> 5335 bytes .../__pycache__/monitoring_pb2.cpython-36.pyc | Bin 0 -> 3090 bytes .../api/__pycache__/quota_pb2.cpython-36.pyc | Bin 0 -> 5344 bytes .../__pycache__/service_pb2.cpython-36.pyc | Bin 0 -> 8136 bytes .../source_info_pb2.cpython-36.pyc | Bin 0 -> 2186 bytes .../system_parameter_pb2.cpython-36.pyc | Bin 0 -> 3333 bytes .../api/__pycache__/usage_pb2.cpython-36.pyc | Bin 0 -> 3106 bytes .../google/api/annotations_pb2.py | 45 + .../site-packages/google/api/auth_pb2.py | 295 + .../site-packages/google/api/backend_pb2.py | 131 + .../site-packages/google/api/billing_pb2.py | 119 + .../google/api/config_change_pb2.py | 176 + .../site-packages/google/api/consumer_pb2.py | 161 + .../site-packages/google/api/context_pb2.py | 124 + .../site-packages/google/api/control_pb2.py | 70 + .../google/api/distribution_pb2.py | 368 + .../google/api/documentation_pb2.py | 207 + .../site-packages/google/api/endpoint_pb2.py | 100 + .../site-packages/google/api/http_pb2.py | 249 + .../site-packages/google/api/httpbody_pb2.py | 87 + .../site-packages/google/api/label_pb2.py | 113 + .../site-packages/google/api/log_pb2.py | 94 + .../site-packages/google/api/logging_pb2.py | 127 + .../site-packages/google/api/metric_pb2.py | 294 + .../google/api/monitored_resource_pb2.py | 291 + .../google/api/monitoring_pb2.py | 127 + .../site-packages/google/api/quota_pb2.py | 325 + .../site-packages/google/api/service_pb2.py | 281 + .../google/api/source_info_pb2.py | 73 + .../google/api/system_parameter_pb2.py | 171 + .../site-packages/google/api/usage_pb2.py | 140 + .../site-packages/google/api_core/__init__.py | 23 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 370 bytes .../api_core/__pycache__/bidi.cpython-36.pyc | Bin 0 -> 17487 bytes .../datetime_helpers.cpython-36.pyc | Bin 0 -> 7061 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 15766 bytes .../general_helpers.cpython-36.pyc | Bin 0 -> 557 bytes .../__pycache__/grpc_helpers.cpython-36.pyc | Bin 0 -> 11867 bytes .../api_core/__pycache__/iam.cpython-36.pyc | Bin 0 -> 6478 bytes .../__pycache__/operation.cpython-36.pyc | Bin 0 -> 9887 bytes .../__pycache__/page_iterator.cpython-36.pyc | Bin 0 -> 17262 bytes .../__pycache__/path_template.cpython-36.pyc | Bin 0 -> 5111 bytes .../protobuf_helpers.cpython-36.pyc | Bin 0 -> 9044 bytes .../api_core/__pycache__/retry.cpython-36.pyc | Bin 0 -> 9560 bytes .../__pycache__/timeout.cpython-36.pyc | Bin 0 -> 6907 bytes .../site-packages/google/api_core/bidi.py | 600 ++ .../google/api_core/datetime_helpers.py | 265 + .../google/api_core/exceptions.py | 462 + .../google/api_core/future/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 303 bytes .../__pycache__/_helpers.cpython-36.pyc | Bin 0 -> 819 bytes .../future/__pycache__/base.cpython-36.pyc | Bin 0 -> 1792 bytes .../future/__pycache__/polling.cpython-36.pyc | Bin 0 -> 5665 bytes .../google/api_core/future/_helpers.py | 39 + .../google/api_core/future/base.py | 67 + .../google/api_core/future/polling.py | 183 + .../google/api_core/gapic_v1/__init__.py | 20 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 357 bytes .../__pycache__/client_info.cpython-36.pyc | Bin 0 -> 2688 bytes .../__pycache__/config.cpython-36.pyc | Bin 0 -> 4834 bytes .../__pycache__/method.cpython-36.pyc | Bin 0 -> 7341 bytes .../__pycache__/routing_header.cpython-36.pyc | Bin 0 -> 1461 bytes .../google/api_core/gapic_v1/client_info.py | 94 + .../google/api_core/gapic_v1/config.py | 167 + .../google/api_core/gapic_v1/method.py | 242 + .../api_core/gapic_v1/routing_header.py | 62 + .../google/api_core/general_helpers.py | 32 + .../google/api_core/grpc_helpers.py | 384 + .../site-packages/google/api_core/iam.py | 248 + .../google/api_core/operation.py | 308 + .../google/api_core/operations_v1/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 363 bytes .../operations_client.cpython-36.pyc | Bin 0 -> 11392 bytes .../operations_client_config.cpython-36.pyc | Bin 0 -> 896 bytes .../operations_v1/operations_client.py | 288 + .../operations_v1/operations_client_config.py | 59 + .../google/api_core/page_iterator.py | 549 ++ .../google/api_core/path_template.py | 197 + .../google/api_core/protobuf_helpers.py | 359 + .../site-packages/google/api_core/retry.py | 340 + .../site-packages/google/api_core/timeout.py | 224 + .../site-packages/google/auth/__init__.py | 28 + .../auth/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 351 bytes .../__pycache__/_cloud_sdk.cpython-36.pyc | Bin 0 -> 2771 bytes .../auth/__pycache__/_default.cpython-36.pyc | Bin 0 -> 9166 bytes .../auth/__pycache__/_helpers.cpython-36.pyc | Bin 0 -> 5859 bytes .../__pycache__/_oauth2client.cpython-36.pyc | Bin 0 -> 4974 bytes .../_service_account_info.cpython-36.pyc | Bin 0 -> 1966 bytes .../__pycache__/app_engine.cpython-36.pyc | Bin 0 -> 4563 bytes .../__pycache__/credentials.cpython-36.pyc | Bin 0 -> 11675 bytes .../environment_vars.cpython-36.pyc | Bin 0 -> 442 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 1067 bytes .../auth/__pycache__/iam.cpython-36.pyc | Bin 0 -> 3248 bytes .../impersonated_credentials.cpython-36.pyc | Bin 0 -> 7725 bytes .../auth/__pycache__/jwt.cpython-36.pyc | Bin 0 -> 23506 bytes .../site-packages/google/auth/_cloud_sdk.py | 126 + .../site-packages/google/auth/_default.py | 306 + .../site-packages/google/auth/_helpers.py | 217 + .../google/auth/_oauth2client.py | 171 + .../google/auth/_service_account_info.py | 73 + .../site-packages/google/auth/app_engine.py | 156 + .../google/auth/compute_engine/__init__.py | 24 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 357 bytes .../__pycache__/_metadata.cpython-36.pyc | Bin 0 -> 5777 bytes .../__pycache__/credentials.cpython-36.pyc | Bin 0 -> 7893 bytes .../google/auth/compute_engine/_metadata.py | 204 + .../google/auth/compute_engine/credentials.py | 239 + .../site-packages/google/auth/credentials.py | 322 + .../google/auth/crypt/__init__.py | 79 + .../crypt/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1867 bytes .../_cryptography_rsa.cpython-36.pyc | Bin 0 -> 4787 bytes .../crypt/__pycache__/_helpers.cpython-36.pyc | Bin 0 -> 148 bytes .../__pycache__/_python_rsa.cpython-36.pyc | Bin 0 -> 5678 bytes .../crypt/__pycache__/base.cpython-36.pyc | Bin 0 -> 4084 bytes .../auth/crypt/__pycache__/rsa.cpython-36.pyc | Bin 0 -> 389 bytes .../google/auth/crypt/_cryptography_rsa.py | 149 + .../google/auth/crypt/_helpers.py | 0 .../google/auth/crypt/_python_rsa.py | 176 + .../site-packages/google/auth/crypt/base.py | 131 + .../site-packages/google/auth/crypt/rsa.py | 30 + .../google/auth/environment_vars.py | 49 + .../site-packages/google/auth/exceptions.py | 32 + .../site-packages/google/auth/iam.py | 102 + .../google/auth/impersonated_credentials.py | 231 + .../site-packages/google/auth/jwt.py | 757 ++ .../google/auth/transport/__init__.py | 96 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3106 bytes .../__pycache__/_http_client.cpython-36.pyc | Bin 0 -> 3392 bytes .../transport/__pycache__/grpc.cpython-36.pyc | Bin 0 -> 4273 bytes .../__pycache__/requests.cpython-36.pyc | Bin 0 -> 6574 bytes .../__pycache__/urllib3.cpython-36.pyc | Bin 0 -> 7364 bytes .../google/auth/transport/_http_client.py | 113 + .../google/auth/transport/grpc.py | 135 + .../google/auth/transport/requests.py | 226 + .../google/auth/transport/urllib3.py | 266 + .../cloud/__pycache__/vision.cpython-36.pyc | Bin 0 -> 427 bytes .../site-packages/google/cloud/vision.py | 27 + .../google/cloud/vision_helpers/__init__.py | 82 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2868 bytes .../__pycache__/decorators.cpython-36.pyc | Bin 0 -> 2562 bytes .../google/cloud/vision_helpers/decorators.py | 119 + .../google/cloud/vision_v1/__init__.py | 44 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1014 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 1454 bytes .../google/cloud/vision_v1/gapic/__init__.py | 0 .../gapic/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 167 bytes .../gapic/__pycache__/enums.cpython-36.pyc | Bin 0 -> 10785 bytes .../image_annotator_client.cpython-36.pyc | Bin 0 -> 10691 bytes ...age_annotator_client_config.cpython-36.pyc | Bin 0 -> 776 bytes .../product_search_client.cpython-36.pyc | Bin 0 -> 57788 bytes ...roduct_search_client_config.cpython-36.pyc | Bin 0 -> 1328 bytes .../google/cloud/vision_v1/gapic/enums.py | 247 + .../vision_v1/gapic/image_annotator_client.py | 313 + .../gapic/image_annotator_client_config.py | 33 + .../vision_v1/gapic/product_search_client.py | 1625 ++++ .../gapic/product_search_client_config.py | 113 + .../vision_v1/gapic/transports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 178 bytes ...ge_annotator_grpc_transport.cpython-36.pyc | Bin 0 -> 4582 bytes ...oduct_search_grpc_transport.cpython-36.pyc | Bin 0 -> 17056 bytes .../image_annotator_grpc_transport.py | 145 + .../product_search_grpc_transport.py | 483 + .../google/cloud/vision_v1/proto/__init__.py | 0 .../proto/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 167 bytes .../__pycache__/geometry_pb2.cpython-36.pyc | Bin 0 -> 4692 bytes .../geometry_pb2_grpc.cpython-36.pyc | Bin 0 -> 192 bytes .../image_annotator_pb2.cpython-36.pyc | Bin 0 -> 56403 bytes .../image_annotator_pb2_grpc.cpython-36.pyc | Bin 0 -> 3365 bytes .../product_search_pb2.cpython-36.pyc | Bin 0 -> 8334 bytes .../product_search_pb2_grpc.cpython-36.pyc | Bin 0 -> 198 bytes .../product_search_service_pb2.cpython-36.pyc | Bin 0 -> 47349 bytes ...uct_search_service_pb2_grpc.cpython-36.pyc | Bin 0 -> 16309 bytes .../text_annotation_pb2.cpython-36.pyc | Bin 0 -> 16204 bytes .../text_annotation_pb2_grpc.cpython-36.pyc | Bin 0 -> 199 bytes .../web_detection_pb2.cpython-36.pyc | Bin 0 -> 8982 bytes .../web_detection_pb2_grpc.cpython-36.pyc | Bin 0 -> 197 bytes .../cloud/vision_v1/proto/geometry_pb2.py | 267 + .../vision_v1/proto/geometry_pb2_grpc.py | 3 + .../vision_v1/proto/image_annotator_pb2.py | 2822 ++++++ .../proto/image_annotator_pb2_grpc.py | 73 + .../vision_v1/proto/product_search_pb2.py | 325 + .../proto/product_search_pb2_grpc.py | 3 + .../proto/product_search_service_pb2.py | 2186 +++++ .../proto/product_search_service_pb2_grpc.py | 493 + .../vision_v1/proto/text_annotation_pb2.py | 791 ++ .../proto/text_annotation_pb2_grpc.py | 3 + .../vision_v1/proto/web_detection_pb2.py | 406 + .../vision_v1/proto/web_detection_pb2_grpc.py | 3 + .../google/cloud/vision_v1/types.py | 75 + .../google/cloud/vision_v1p1beta1/__init__.py | 37 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 805 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 1195 bytes .../cloud/vision_v1p1beta1/gapic/__init__.py | 0 .../gapic/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 174 bytes .../gapic/__pycache__/enums.cpython-36.pyc | Bin 0 -> 8512 bytes .../image_annotator_client.cpython-36.pyc | Bin 0 -> 7359 bytes ...age_annotator_client_config.cpython-36.pyc | Bin 0 -> 749 bytes .../cloud/vision_v1p1beta1/gapic/enums.py | 198 + .../gapic/image_annotator_client.py | 226 + .../gapic/image_annotator_client_config.py | 28 + .../gapic/transports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 185 bytes ...ge_annotator_grpc_transport.cpython-36.pyc | Bin 0 -> 3574 bytes .../image_annotator_grpc_transport.py | 120 + .../cloud/vision_v1p1beta1/proto/__init__.py | 0 .../proto/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 174 bytes .../__pycache__/geometry_pb2.cpython-36.pyc | Bin 0 -> 3908 bytes .../geometry_pb2_grpc.cpython-36.pyc | Bin 0 -> 199 bytes .../image_annotator_pb2.cpython-36.pyc | Bin 0 -> 41619 bytes .../image_annotator_pb2_grpc.cpython-36.pyc | Bin 0 -> 2414 bytes .../text_annotation_pb2.cpython-36.pyc | Bin 0 -> 16493 bytes .../text_annotation_pb2_grpc.cpython-36.pyc | Bin 0 -> 206 bytes .../web_detection_pb2.cpython-36.pyc | Bin 0 -> 9182 bytes .../web_detection_pb2_grpc.cpython-36.pyc | Bin 0 -> 204 bytes .../vision_v1p1beta1/proto/geometry_pb2.py | 201 + .../proto/geometry_pb2_grpc.py | 3 + .../proto/image_annotator_pb2.py | 1986 ++++ .../proto/image_annotator_pb2_grpc.py | 50 + .../proto/text_annotation_pb2.py | 788 ++ .../proto/text_annotation_pb2_grpc.py | 3 + .../proto/web_detection_pb2.py | 405 + .../proto/web_detection_pb2_grpc.py | 3 + .../google/cloud/vision_v1p1beta1/types.py | 63 + .../google/cloud/vision_v1p2beta1/__init__.py | 37 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 805 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 1334 bytes .../cloud/vision_v1p2beta1/gapic/__init__.py | 0 .../gapic/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 174 bytes .../gapic/__pycache__/enums.cpython-36.pyc | Bin 0 -> 9531 bytes .../image_annotator_client.cpython-36.pyc | Bin 0 -> 10598 bytes ...age_annotator_client_config.cpython-36.pyc | Bin 0 -> 790 bytes .../cloud/vision_v1p2beta1/gapic/enums.py | 221 + .../gapic/image_annotator_client.py | 309 + .../gapic/image_annotator_client_config.py | 33 + .../gapic/transports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 185 bytes ...ge_annotator_grpc_transport.cpython-36.pyc | Bin 0 -> 4587 bytes .../image_annotator_grpc_transport.py | 145 + .../cloud/vision_v1p2beta1/proto/__init__.py | 0 .../proto/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 174 bytes .../__pycache__/geometry_pb2.cpython-36.pyc | Bin 0 -> 4712 bytes .../geometry_pb2_grpc.cpython-36.pyc | Bin 0 -> 199 bytes .../image_annotator_pb2.cpython-36.pyc | Bin 0 -> 54533 bytes .../image_annotator_pb2_grpc.cpython-36.pyc | Bin 0 -> 3391 bytes .../text_annotation_pb2.cpython-36.pyc | Bin 0 -> 16704 bytes .../text_annotation_pb2_grpc.cpython-36.pyc | Bin 0 -> 206 bytes .../web_detection_pb2.cpython-36.pyc | Bin 0 -> 9182 bytes .../web_detection_pb2_grpc.cpython-36.pyc | Bin 0 -> 204 bytes .../vision_v1p2beta1/proto/geometry_pb2.py | 265 + .../proto/geometry_pb2_grpc.py | 3 + .../proto/image_annotator_pb2.py | 2690 ++++++ .../proto/image_annotator_pb2_grpc.py | 73 + .../proto/text_annotation_pb2.py | 791 ++ .../proto/text_annotation_pb2_grpc.py | 3 + .../proto/web_detection_pb2.py | 405 + .../proto/web_detection_pb2_grpc.py | 3 + .../google/cloud/vision_v1p2beta1/types.py | 69 + .../google/cloud/vision_v1p3beta1/__init__.py | 44 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1035 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 1475 bytes .../cloud/vision_v1p3beta1/gapic/__init__.py | 0 .../gapic/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 174 bytes .../gapic/__pycache__/enums.cpython-36.pyc | Bin 0 -> 11790 bytes .../image_annotator_client.cpython-36.pyc | Bin 0 -> 10803 bytes ...age_annotator_client_config.cpython-36.pyc | Bin 0 -> 795 bytes .../product_search_client.cpython-36.pyc | Bin 0 -> 58832 bytes ...roduct_search_client_config.cpython-36.pyc | Bin 0 -> 1347 bytes .../cloud/vision_v1p3beta1/gapic/enums.py | 275 + .../gapic/image_annotator_client.py | 313 + .../gapic/image_annotator_client_config.py | 33 + .../gapic/product_search_client.py | 1640 ++++ .../gapic/product_search_client_config.py | 113 + .../gapic/transports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 185 bytes ...ge_annotator_grpc_transport.cpython-36.pyc | Bin 0 -> 4603 bytes ...oduct_search_grpc_transport.cpython-36.pyc | Bin 0 -> 17058 bytes .../image_annotator_grpc_transport.py | 145 + .../product_search_grpc_transport.py | 483 + .../cloud/vision_v1p3beta1/proto/__init__.py | 0 .../proto/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 174 bytes .../__pycache__/geometry_pb2.cpython-36.pyc | Bin 0 -> 5482 bytes .../geometry_pb2_grpc.cpython-36.pyc | Bin 0 -> 199 bytes .../image_annotator_pb2.cpython-36.pyc | Bin 0 -> 57806 bytes .../image_annotator_pb2_grpc.cpython-36.pyc | Bin 0 -> 3407 bytes .../product_search_pb2.cpython-36.pyc | Bin 0 -> 12193 bytes .../product_search_pb2_grpc.cpython-36.pyc | Bin 0 -> 205 bytes .../product_search_service_pb2.cpython-36.pyc | Bin 0 -> 48472 bytes ...uct_search_service_pb2_grpc.cpython-36.pyc | Bin 0 -> 16508 bytes .../text_annotation_pb2.cpython-36.pyc | Bin 0 -> 16704 bytes .../text_annotation_pb2_grpc.cpython-36.pyc | Bin 0 -> 206 bytes .../web_detection_pb2.cpython-36.pyc | Bin 0 -> 9182 bytes .../web_detection_pb2_grpc.cpython-36.pyc | Bin 0 -> 204 bytes .../vision_v1p3beta1/proto/geometry_pb2.py | 315 + .../proto/geometry_pb2_grpc.py | 3 + .../proto/image_annotator_pb2.py | 2819 ++++++ .../proto/image_annotator_pb2_grpc.py | 73 + .../proto/product_search_pb2.py | 466 + .../proto/product_search_pb2_grpc.py | 3 + .../proto/product_search_service_pb2.py | 2180 +++++ .../proto/product_search_service_pb2_grpc.py | 492 + .../proto/text_annotation_pb2.py | 791 ++ .../proto/text_annotation_pb2_grpc.py | 3 + .../proto/web_detection_pb2.py | 405 + .../proto/web_detection_pb2_grpc.py | 3 + .../google/cloud/vision_v1p3beta1/types.py | 75 + .../google/logging/type/__init__.py | 0 .../type/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 163 bytes .../http_request_pb2.cpython-36.pyc | Bin 0 -> 4218 bytes .../log_severity_pb2.cpython-36.pyc | Bin 0 -> 2361 bytes .../google/logging/type/http_request_pb2.py | 166 + .../google/logging/type/log_severity_pb2.py | 96 + .../google/longrunning/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 162 bytes .../operations_grpc.cpython-36.pyc | Bin 0 -> 274 bytes .../operations_grpc_pb2.cpython-36.pyc | Bin 0 -> 19169 bytes .../__pycache__/operations_pb2.cpython-36.pyc | Bin 0 -> 630 bytes .../operations_proto.cpython-36.pyc | Bin 0 -> 276 bytes .../operations_proto_pb2.cpython-36.pyc | Bin 0 -> 6441 bytes .../google/longrunning/operations_grpc.py | 5 + .../google/longrunning/operations_grpc_pb2.py | 636 ++ .../google/longrunning/operations_pb2.py | 27 + .../google/longrunning/operations_proto.py | 5 + .../longrunning/operations_proto_pb2.py | 340 + .../site-packages/google/oauth2/__init__.py | 15 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 192 bytes .../oauth2/__pycache__/_client.cpython-36.pyc | Bin 0 -> 6713 bytes .../__pycache__/credentials.cpython-36.pyc | Bin 0 -> 6821 bytes .../__pycache__/id_token.cpython-36.pyc | Bin 0 -> 4891 bytes .../service_account.cpython-36.pyc | Bin 0 -> 18569 bytes .../site-packages/google/oauth2/_client.py | 249 + .../google/oauth2/credentials.py | 194 + .../site-packages/google/oauth2/id_token.py | 159 + .../google/oauth2/service_account.py | 542 ++ .../site-packages/google/protobuf/__init__.py | 39 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 349 bytes .../__pycache__/any_pb2.cpython-36.pyc | Bin 0 -> 2090 bytes .../__pycache__/any_test_pb2.cpython-36.pyc | Bin 0 -> 2245 bytes .../__pycache__/api_pb2.cpython-36.pyc | Bin 0 -> 4796 bytes .../__pycache__/descriptor.cpython-36.pyc | Bin 0 -> 33172 bytes .../descriptor_database.cpython-36.pyc | Bin 0 -> 4450 bytes .../__pycache__/descriptor_pb2.cpython-36.pyc | Bin 0 -> 31490 bytes .../descriptor_pool.cpython-36.pyc | Bin 0 -> 28413 bytes .../__pycache__/duration_pb2.cpython-36.pyc | Bin 0 -> 2129 bytes .../__pycache__/empty_pb2.cpython-36.pyc | Bin 0 -> 1686 bytes .../__pycache__/field_mask_pb2.cpython-36.pyc | Bin 0 -> 2049 bytes .../__pycache__/json_format.cpython-36.pyc | Bin 0 -> 21078 bytes .../map_proto2_unittest_pb2.cpython-36.pyc | Bin 0 -> 18034 bytes .../map_unittest_pb2.cpython-36.pyc | Bin 0 -> 38773 bytes .../__pycache__/message.cpython-36.pyc | Bin 0 -> 10758 bytes .../message_factory.cpython-36.pyc | Bin 0 -> 4058 bytes .../__pycache__/proto_builder.cpython-36.pyc | Bin 0 -> 2773 bytes .../__pycache__/reflection.cpython-36.pyc | Bin 0 -> 2747 bytes .../__pycache__/service.cpython-36.pyc | Bin 0 -> 8791 bytes .../service_reflection.cpython-36.pyc | Bin 0 -> 10020 bytes .../source_context_pb2.cpython-36.pyc | Bin 0 -> 2148 bytes .../__pycache__/struct_pb2.cpython-36.pyc | Bin 0 -> 5040 bytes .../symbol_database.cpython-36.pyc | Bin 0 -> 5474 bytes .../test_messages_proto2_pb2.cpython-36.pyc | Bin 0 -> 38643 bytes .../test_messages_proto3_pb2.cpython-36.pyc | Bin 0 -> 43324 bytes .../__pycache__/text_encoding.cpython-36.pyc | Bin 0 -> 3161 bytes .../__pycache__/text_format.cpython-36.pyc | Bin 0 -> 39950 bytes .../__pycache__/timestamp_pb2.cpython-36.pyc | Bin 0 -> 2143 bytes .../__pycache__/type_pb2.cpython-36.pyc | Bin 0 -> 8651 bytes .../unittest_arena_pb2.cpython-36.pyc | Bin 0 -> 2779 bytes ...unittest_custom_options_pb2.cpython-36.pyc | Bin 0 -> 32085 bytes .../unittest_import_pb2.cpython-36.pyc | Bin 0 -> 3138 bytes .../unittest_import_public_pb2.cpython-36.pyc | Bin 0 -> 1929 bytes .../unittest_mset_pb2.cpython-36.pyc | Bin 0 -> 4518 bytes ...ittest_mset_wire_format_pb2.cpython-36.pyc | Bin 0 -> 2473 bytes ...nittest_no_arena_import_pb2.cpython-36.pyc | Bin 0 -> 1882 bytes .../unittest_no_arena_pb2.cpython-36.pyc | Bin 0 -> 20273 bytes ...est_no_generic_services_pb2.cpython-36.pyc | Bin 0 -> 3316 bytes .../__pycache__/unittest_pb2.cpython-36.pyc | Bin 0 -> 130672 bytes .../unittest_proto3_arena_pb2.cpython-36.pyc | Bin 0 -> 20297 bytes .../__pycache__/wrappers_pb2.cpython-36.pyc | Bin 0 -> 4641 bytes .../site-packages/google/protobuf/any_pb2.py | 77 + .../google/protobuf/any_test_pb2.py | 87 + .../site-packages/google/protobuf/api_pb2.py | 249 + .../google/protobuf/compiler/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 152 bytes .../__pycache__/plugin_pb2.cpython-36.pyc | Bin 0 -> 4904 bytes .../google/protobuf/compiler/plugin_pb2.py | 255 + .../google/protobuf/descriptor.py | 1076 +++ .../google/protobuf/descriptor_database.py | 162 + .../google/protobuf/descriptor_pb2.py | 2033 ++++ .../google/protobuf/descriptor_pool.py | 1057 +++ .../google/protobuf/duration_pb2.py | 77 + .../google/protobuf/empty_pb2.py | 63 + .../google/protobuf/field_mask_pb2.py | 70 + .../google/protobuf/internal/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 152 bytes .../__pycache__/_parameterized.cpython-36.pyc | Bin 0 -> 13707 bytes .../__pycache__/any_test_pb2.cpython-36.pyc | Bin 0 -> 3583 bytes .../api_implementation.cpython-36.pyc | Bin 0 -> 2529 bytes .../__pycache__/containers.cpython-36.pyc | Bin 0 -> 20329 bytes .../__pycache__/decoder.cpython-36.pyc | Bin 0 -> 21111 bytes .../descriptor_database_test.cpython-36.pyc | Bin 0 -> 2890 bytes .../descriptor_pool_test.cpython-36.pyc | Bin 0 -> 30353 bytes .../descriptor_pool_test1_pb2.cpython-36.pyc | Bin 0 -> 8707 bytes .../descriptor_pool_test2_pb2.cpython-36.pyc | Bin 0 -> 6115 bytes .../descriptor_test.cpython-36.pyc | Bin 0 -> 30166 bytes .../__pycache__/encoder.cpython-36.pyc | Bin 0 -> 24222 bytes .../enum_type_wrapper.cpython-36.pyc | Bin 0 -> 2755 bytes .../factory_test1_pb2.cpython-36.pyc | Bin 0 -> 4380 bytes .../factory_test2_pb2.cpython-36.pyc | Bin 0 -> 10797 bytes .../file_options_test_pb2.cpython-36.pyc | Bin 0 -> 2395 bytes .../__pycache__/generator_test.cpython-36.pyc | Bin 0 -> 10810 bytes .../json_format_test.cpython-36.pyc | Bin 0 -> 29211 bytes .../message_factory_test.cpython-36.pyc | Bin 0 -> 5506 bytes .../message_listener.cpython-36.pyc | Bin 0 -> 2324 bytes .../message_set_extensions_pb2.cpython-36.pyc | Bin 0 -> 4104 bytes .../__pycache__/message_test.cpython-36.pyc | Bin 0 -> 60628 bytes .../missing_enum_values_pb2.cpython-36.pyc | Bin 0 -> 4613 bytes ...more_extensions_dynamic_pb2.cpython-36.pyc | Bin 0 -> 3187 bytes .../more_extensions_pb2.cpython-36.pyc | Bin 0 -> 3921 bytes .../more_messages_pb2.cpython-36.pyc | Bin 0 -> 2782 bytes .../__pycache__/no_package_pb2.cpython-36.pyc | Bin 0 -> 2352 bytes .../packed_field_test_pb2.cpython-36.pyc | Bin 0 -> 7374 bytes .../proto_builder_test.cpython-36.pyc | Bin 0 -> 2349 bytes .../__pycache__/python_message.cpython-36.pyc | Bin 0 -> 42444 bytes .../reflection_test.cpython-36.pyc | Bin 0 -> 80408 bytes .../service_reflection_test.cpython-36.pyc | Bin 0 -> 4193 bytes .../symbol_database_test.cpython-36.pyc | Bin 0 -> 3774 bytes .../test_bad_identifiers_pb2.cpython-36.pyc | Bin 0 -> 3511 bytes .../__pycache__/test_util.cpython-36.pyc | Bin 0 -> 25403 bytes .../testing_refleaks.cpython-36.pyc | Bin 0 -> 3064 bytes .../text_encoding_test.cpython-36.pyc | Bin 0 -> 1403 bytes .../text_format_test.cpython-36.pyc | Bin 0 -> 49952 bytes .../__pycache__/type_checkers.cpython-36.pyc | Bin 0 -> 9189 bytes .../unknown_fields_test.cpython-36.pyc | Bin 0 -> 9190 bytes .../well_known_types.cpython-36.pyc | Bin 0 -> 26185 bytes .../well_known_types_test.cpython-36.pyc | Bin 0 -> 21001 bytes .../__pycache__/wire_format.cpython-36.pyc | Bin 0 -> 6459 bytes .../wire_format_test.cpython-36.pyc | Bin 0 -> 5601 bytes ...ementation.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 5408 bytes .../protobuf/internal/_parameterized.py | 442 + .../google/protobuf/internal/any_test_pb2.py | 182 + .../protobuf/internal/api_implementation.py | 173 + .../google/protobuf/internal/containers.py | 630 ++ .../google/protobuf/internal/decoder.py | 854 ++ .../internal/descriptor_database_test.py | 124 + .../protobuf/internal/descriptor_pool_test.py | 1055 +++ .../internal/descriptor_pool_test1_pb2.py | 474 + .../internal/descriptor_pool_test2_pb2.py | 266 + .../protobuf/internal/descriptor_test.py | 1036 +++ .../google/protobuf/internal/encoder.py | 828 ++ .../protobuf/internal/enum_type_wrapper.py | 89 + .../protobuf/internal/factory_test1_pb2.py | 190 + .../protobuf/internal/factory_test2_pb2.py | 517 ++ .../internal/file_options_test_pb2.py | 82 + .../protobuf/internal/generator_test.py | 349 + .../internal/import_test_package/__init__.py | 33 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 327 bytes .../__pycache__/inner_pb2.cpython-36.pyc | Bin 0 -> 1959 bytes .../__pycache__/outer_pb2.cpython-36.pyc | Bin 0 -> 2292 bytes .../internal/import_test_package/inner_pb2.py | 69 + .../internal/import_test_package/outer_pb2.py | 72 + .../protobuf/internal/json_format_test.py | 1038 +++ .../protobuf/internal/message_factory_test.py | 222 + .../protobuf/internal/message_listener.py | 78 + .../internal/message_set_extensions_pb2.py | 209 + .../google/protobuf/internal/message_test.py | 2203 +++++ .../internal/missing_enum_values_pb2.py | 227 + .../internal/more_extensions_dynamic_pb2.py | 103 + .../protobuf/internal/more_extensions_pb2.py | 183 + .../protobuf/internal/more_messages_pb2.py | 103 + .../protobuf/internal/no_package_pb2.py | 97 + .../internal/packed_field_test_pb2.py | 334 + .../protobuf/internal/proto_builder_test.py | 96 + .../protobuf/internal/python_message.py | 1559 ++++ .../protobuf/internal/reflection_test.py | 3106 +++++++ .../internal/service_reflection_test.py | 144 + .../protobuf/internal/symbol_database_test.py | 138 + .../internal/test_bad_identifiers_pb2.py | 163 + .../google/protobuf/internal/test_util.py | 868 ++ .../protobuf/internal/testing_refleaks.py | 126 + .../protobuf/internal/text_encoding_test.py | 72 + .../protobuf/internal/text_format_test.py | 1656 ++++ .../google/protobuf/internal/type_checkers.py | 353 + .../protobuf/internal/unknown_fields_test.py | 336 + .../protobuf/internal/well_known_types.py | 839 ++ .../internal/well_known_types_test.py | 927 ++ .../google/protobuf/internal/wire_format.py | 268 + .../protobuf/internal/wire_format_test.py | 257 + .../google/protobuf/json_format.py | 785 ++ .../protobuf/map_proto2_unittest_pb2.py | 1312 +++ .../google/protobuf/map_unittest_pb2.py | 2813 ++++++ .../site-packages/google/protobuf/message.py | 308 + .../google/protobuf/message_factory.py | 151 + .../google/protobuf/proto_builder.py | 130 + .../google/protobuf/pyext/__init__.py | 4 + .../pyext/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 309 bytes .../__pycache__/cpp_message.cpython-36.pyc | Bin 0 -> 1428 bytes .../__pycache__/python_pb2.cpython-36.pyc | Bin 0 -> 4663 bytes .../_message.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 2253432 bytes .../google/protobuf/pyext/cpp_message.py | 65 + .../google/protobuf/pyext/python_pb2.py | 233 + .../google/protobuf/reflection.py | 121 + .../site-packages/google/protobuf/service.py | 226 + .../google/protobuf/service_reflection.py | 284 + .../google/protobuf/source_context_pb2.py | 70 + .../google/protobuf/struct_pb2.py | 279 + .../google/protobuf/symbol_database.py | 189 + .../protobuf/test_messages_proto2_pb2.py | 1990 ++++ .../protobuf/test_messages_proto3_pb2.py | 2044 ++++ .../google/protobuf/text_encoding.py | 107 + .../google/protobuf/text_format.py | 1593 ++++ .../google/protobuf/timestamp_pb2.py | 77 + .../site-packages/google/protobuf/type_pb2.py | 540 ++ .../google/protobuf/unittest_arena_pb2.py | 120 + .../protobuf/unittest_custom_options_pb2.py | 1845 ++++ .../google/protobuf/unittest_import_pb2.py | 137 + .../protobuf/unittest_import_public_pb2.py | 70 + .../google/protobuf/unittest_mset_pb2.py | 255 + .../protobuf/unittest_mset_wire_format_pb2.py | 104 + .../protobuf/unittest_no_arena_import_pb2.py | 69 + .../google/protobuf/unittest_no_arena_pb2.py | 911 ++ .../unittest_no_generic_services_pb2.py | 125 + .../google/protobuf/unittest_pb2.py | 7082 ++++++++++++++ .../protobuf/unittest_proto3_arena_pb2.py | 999 ++ .../google/protobuf/util/__init__.py | 0 .../util/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 148 bytes .../json_format_proto3_pb2.cpython-36.pyc | Bin 0 -> 25947 bytes .../protobuf/util/json_format_proto3_pb2.py | 1895 ++++ .../google/protobuf/wrappers_pb2.py | 382 + .../site-packages/google/rpc/__init__.py | 0 .../rpc/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 154 bytes .../rpc/__pycache__/code_pb2.cpython-36.pyc | Bin 0 -> 2768 bytes .../error_details_pb2.cpython-36.pyc | Bin 0 -> 7991 bytes .../rpc/__pycache__/status_pb2.cpython-36.pyc | Bin 0 -> 2336 bytes .../site-packages/google/rpc/code_pb2.py | 133 + .../google/rpc/error_details_pb2.py | 622 ++ .../site-packages/google/rpc/status_pb2.py | 87 + .../site-packages/google/type/__init__.py | 0 .../type/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 155 bytes .../type/__pycache__/color_pb2.cpython-36.pyc | Bin 0 -> 2441 bytes .../type/__pycache__/date_pb2.cpython-36.pyc | Bin 0 -> 2090 bytes .../__pycache__/dayofweek_pb2.cpython-36.pyc | Bin 0 -> 2133 bytes .../__pycache__/latlng_pb2.cpython-36.pyc | Bin 0 -> 2059 bytes .../type/__pycache__/money_pb2.cpython-36.pyc | Bin 0 -> 2164 bytes .../postal_address_pb2.cpython-36.pyc | Bin 0 -> 3473 bytes .../__pycache__/timeofday_pb2.cpython-36.pyc | Bin 0 -> 2298 bytes .../site-packages/google/type/color_pb2.py | 94 + .../site-packages/google/type/date_pb2.py | 84 + .../google/type/dayofweek_pb2.py | 88 + .../site-packages/google/type/latlng_pb2.py | 77 + .../site-packages/google/type/money_pb2.py | 84 + .../google/type/postal_address_pb2.py | 140 + .../google/type/timeofday_pb2.py | 91 + .../google_api_core-1.6.0-py3.6-nspkg.pth | 1 + .../google_api_core-1.6.0.dist-info/INSTALLER | 1 + .../google_api_core-1.6.0.dist-info/LICENSE | 202 + .../google_api_core-1.6.0.dist-info/METADATA | 52 + .../google_api_core-1.6.0.dist-info/RECORD | 58 + .../google_api_core-1.6.0.dist-info/WHEEL | 6 + .../namespace_packages.txt | 1 + .../top_level.txt | 1 + .../google_auth-1.6.1-py3.7-nspkg.pth | 1 + .../google_auth-1.6.1.dist-info/INSTALLER | 1 + .../google_auth-1.6.1.dist-info/METADATA | 86 + .../google_auth-1.6.1.dist-info/RECORD | 71 + .../google_auth-1.6.1.dist-info/WHEEL | 6 + .../namespace_packages.txt | 1 + .../google_auth-1.6.1.dist-info/top_level.txt | 1 + ...google_cloud_vision-0.35.1-py3.6-nspkg.pth | 3 + .../INSTALLER | 1 + .../LICENSE | 201 + .../METADATA | 129 + .../RECORD | 178 + .../WHEEL | 6 + .../namespace_packages.txt | 2 + .../top_level.txt | 1 + .../googleapis_common_protos-1.5.5-nspkg.pth | 3 + .../DESCRIPTION.rst | 10 + .../INSTALLER | 1 + .../METADATA | 34 + .../RECORD | 101 + .../WHEEL | 5 + .../metadata.json | 1 + .../namespace_packages.txt | 2 + .../top_level.txt | 1 + .../python3.6/site-packages/grpc/__init__.py | 1814 ++++ .../grpc/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 66992 bytes .../grpc/__pycache__/_auth.cpython-36.pyc | Bin 0 -> 2468 bytes .../grpc/__pycache__/_channel.cpython-36.pyc | Bin 0 -> 27940 bytes .../grpc/__pycache__/_common.cpython-36.pyc | Bin 0 -> 2563 bytes .../_grpcio_metadata.cpython-36.pyc | Bin 0 -> 160 bytes .../__pycache__/_interceptor.cpython-36.pyc | Bin 0 -> 16619 bytes .../_plugin_wrapping.cpython-36.pyc | Bin 0 -> 2877 bytes .../grpc/__pycache__/_server.cpython-36.pyc | Bin 0 -> 23234 bytes .../__pycache__/_utilities.cpython-36.pyc | Bin 0 -> 5076 bytes .../lib/python3.6/site-packages/grpc/_auth.py | 75 + .../python3.6/site-packages/grpc/_channel.py | 1056 +++ .../python3.6/site-packages/grpc/_common.py | 98 + .../site-packages/grpc/_cython/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 138 bytes .../grpc/_cython/_credentials/roots.pem | 4342 +++++++++ .../grpc/_cython/_cygrpc/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 146 bytes .../cygrpc.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 4643920 bytes .../site-packages/grpc/_grpcio_metadata.py | 1 + .../site-packages/grpc/_interceptor.py | 516 ++ .../site-packages/grpc/_plugin_wrapping.py | 102 + .../python3.6/site-packages/grpc/_server.py | 838 ++ .../site-packages/grpc/_utilities.py | 166 + .../site-packages/grpc/beta/__init__.py | 13 + .../beta/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 135 bytes .../_client_adaptations.cpython-36.pyc | Bin 0 -> 17985 bytes .../beta/__pycache__/_metadata.cpython-36.pyc | Bin 0 -> 1328 bytes .../_server_adaptations.cpython-36.pyc | Bin 0 -> 11822 bytes .../implementations.cpython-36.pyc | Bin 0 -> 10020 bytes .../__pycache__/interfaces.cpython-36.pyc | Bin 0 -> 6211 bytes .../beta/__pycache__/utilities.cpython-36.pyc | Bin 0 -> 4326 bytes .../grpc/beta/_client_adaptations.py | 696 ++ .../site-packages/grpc/beta/_metadata.py | 52 + .../grpc/beta/_server_adaptations.py | 389 + .../grpc/beta/implementations.py | 310 + .../site-packages/grpc/beta/interfaces.py | 165 + .../site-packages/grpc/beta/utilities.py | 149 + .../grpc/experimental/__init__.py | 17 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 253 bytes .../__pycache__/gevent.cpython-36.pyc | Bin 0 -> 627 bytes .../__pycache__/session_cache.cpython-36.pyc | Bin 0 -> 1460 bytes .../site-packages/grpc/experimental/gevent.py | 27 + .../grpc/experimental/session_cache.py | 45 + .../site-packages/grpc/framework/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 140 bytes .../grpc/framework/common/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 147 bytes .../__pycache__/cardinality.cpython-36.pyc | Bin 0 -> 708 bytes .../common/__pycache__/style.cpython-36.pyc | Bin 0 -> 538 bytes .../grpc/framework/common/cardinality.py | 26 + .../grpc/framework/common/style.py | 24 + .../grpc/framework/foundation/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 151 bytes .../__pycache__/abandonment.cpython-36.pyc | Bin 0 -> 589 bytes .../__pycache__/callable_util.cpython-36.pyc | Bin 0 -> 3088 bytes .../__pycache__/future.cpython-36.pyc | Bin 0 -> 7080 bytes .../__pycache__/logging_pool.cpython-36.pyc | Bin 0 -> 2425 bytes .../__pycache__/stream.cpython-36.pyc | Bin 0 -> 1254 bytes .../__pycache__/stream_util.cpython-36.pyc | Bin 0 -> 4510 bytes .../grpc/framework/foundation/abandonment.py | 22 + .../framework/foundation/callable_util.py | 96 + .../grpc/framework/foundation/future.py | 221 + .../grpc/framework/foundation/logging_pool.py | 71 + .../grpc/framework/foundation/stream.py | 45 + .../grpc/framework/foundation/stream_util.py | 148 + .../grpc/framework/interfaces/__init__.py | 13 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 151 bytes .../framework/interfaces/base/__init__.py | 13 + .../base/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../base/__pycache__/base.cpython-36.pyc | Bin 0 -> 13045 bytes .../base/__pycache__/utilities.cpython-36.pyc | Bin 0 -> 1947 bytes .../grpc/framework/interfaces/base/base.py | 330 + .../framework/interfaces/base/utilities.py | 71 + .../framework/interfaces/face/__init__.py | 13 + .../face/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../face/__pycache__/face.cpython-36.pyc | Bin 0 -> 39709 bytes .../face/__pycache__/utilities.cpython-36.pyc | Bin 0 -> 5250 bytes .../grpc/framework/interfaces/face/face.py | 1052 +++ .../framework/interfaces/face/utilities.py | 168 + .../grpcio-1.17.0.dist-info/INSTALLER | 1 + .../grpcio-1.17.0.dist-info/METADATA | 128 + .../grpcio-1.17.0.dist-info/RECORD | 85 + .../grpcio-1.17.0.dist-info/WHEEL | 5 + .../grpcio-1.17.0.dist-info/top_level.txt | 1 + .../idna-2.8.dist-info/INSTALLER | 1 + .../idna-2.8.dist-info/LICENSE.rst | 80 + .../site-packages/idna-2.8.dist-info/METADATA | 239 + .../site-packages/idna-2.8.dist-info/RECORD | 22 + .../site-packages/idna-2.8.dist-info/WHEEL | 6 + .../idna-2.8.dist-info/top_level.txt | 1 + .../python3.6/site-packages/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 197 bytes .../idna/__pycache__/codec.cpython-36.pyc | Bin 0 -> 3044 bytes .../idna/__pycache__/compat.cpython-36.pyc | Bin 0 -> 557 bytes .../idna/__pycache__/core.cpython-36.pyc | Bin 0 -> 9097 bytes .../idna/__pycache__/idnadata.cpython-36.pyc | Bin 0 -> 29736 bytes .../idna/__pycache__/intranges.cpython-36.pyc | Bin 0 -> 1758 bytes .../__pycache__/package_data.cpython-36.pyc | Bin 0 -> 151 bytes .../idna/__pycache__/uts46data.cpython-36.pyc | Bin 0 -> 241746 bytes .../lib/python3.6/site-packages/idna/codec.py | 118 + .../python3.6/site-packages/idna/compat.py | 12 + venv/lib/python3.6/site-packages/idna/core.py | 396 + .../python3.6/site-packages/idna/idnadata.py | 1979 ++++ .../python3.6/site-packages/idna/intranges.py | 53 + .../site-packages/idna/package_data.py | 2 + .../python3.6/site-packages/idna/uts46data.py | 8205 +++++++++++++++++ .../itsdangerous-1.1.0.dist-info/INSTALLER | 1 + .../itsdangerous-1.1.0.dist-info/LICENSE.rst | 47 + .../itsdangerous-1.1.0.dist-info/METADATA | 98 + .../itsdangerous-1.1.0.dist-info/RECORD | 26 + .../itsdangerous-1.1.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 22 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 972 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1134 bytes .../__pycache__/_json.cpython-36.pyc | Bin 0 -> 827 bytes .../__pycache__/encoding.cpython-36.pyc | Bin 0 -> 1599 bytes .../__pycache__/exc.cpython-36.pyc | Bin 0 -> 3188 bytes .../__pycache__/jws.cpython-36.pyc | Bin 0 -> 6647 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 0 -> 8002 bytes .../__pycache__/signer.cpython-36.pyc | Bin 0 -> 5763 bytes .../__pycache__/timed.cpython-36.pyc | Bin 0 -> 4529 bytes .../__pycache__/url_safe.cpython-36.pyc | Bin 0 -> 2518 bytes .../site-packages/itsdangerous/_compat.py | 46 + .../site-packages/itsdangerous/_json.py | 18 + .../site-packages/itsdangerous/encoding.py | 49 + .../site-packages/itsdangerous/exc.py | 98 + .../site-packages/itsdangerous/jws.py | 218 + .../site-packages/itsdangerous/serializer.py | 233 + .../site-packages/itsdangerous/signer.py | 179 + .../site-packages/itsdangerous/timed.py | 147 + .../site-packages/itsdangerous/url_safe.py | 65 + .../site-packages/jinja2/__init__.py | 83 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2496 bytes .../jinja2/__pycache__/_compat.cpython-36.pyc | Bin 0 -> 3306 bytes .../__pycache__/_identifier.cpython-36.pyc | Bin 0 -> 1809 bytes .../__pycache__/asyncfilters.cpython-36.pyc | Bin 0 -> 4761 bytes .../__pycache__/asyncsupport.cpython-36.pyc | Bin 0 -> 8110 bytes .../jinja2/__pycache__/bccache.cpython-36.pyc | Bin 0 -> 12682 bytes .../__pycache__/compiler.cpython-36.pyc | Bin 0 -> 46863 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 1672 bytes .../jinja2/__pycache__/debug.cpython-36.pyc | Bin 0 -> 9305 bytes .../__pycache__/defaults.cpython-36.pyc | Bin 0 -> 1422 bytes .../__pycache__/environment.cpython-36.pyc | Bin 0 -> 43233 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 4982 bytes .../jinja2/__pycache__/ext.cpython-36.pyc | Bin 0 -> 20073 bytes .../jinja2/__pycache__/filters.cpython-36.pyc | Bin 0 -> 34380 bytes .../__pycache__/idtracking.cpython-36.pyc | Bin 0 -> 9911 bytes .../jinja2/__pycache__/lexer.cpython-36.pyc | Bin 0 -> 18535 bytes .../jinja2/__pycache__/loaders.cpython-36.pyc | Bin 0 -> 16542 bytes .../jinja2/__pycache__/meta.cpython-36.pyc | Bin 0 -> 3633 bytes .../__pycache__/nativetypes.cpython-36.pyc | Bin 0 -> 5096 bytes .../jinja2/__pycache__/nodes.cpython-36.pyc | Bin 0 -> 36630 bytes .../__pycache__/optimizer.cpython-36.pyc | Bin 0 -> 2002 bytes .../jinja2/__pycache__/parser.cpython-36.pyc | Bin 0 -> 25307 bytes .../jinja2/__pycache__/runtime.cpython-36.pyc | Bin 0 -> 24572 bytes .../jinja2/__pycache__/sandbox.cpython-36.pyc | Bin 0 -> 13959 bytes .../jinja2/__pycache__/tests.cpython-36.pyc | Bin 0 -> 4378 bytes .../jinja2/__pycache__/utils.cpython-36.pyc | Bin 0 -> 20835 bytes .../jinja2/__pycache__/visitor.cpython-36.pyc | Bin 0 -> 3318 bytes .../python3.6/site-packages/jinja2/_compat.py | 99 + .../site-packages/jinja2/_identifier.py | 2 + .../site-packages/jinja2/asyncfilters.py | 146 + .../site-packages/jinja2/asyncsupport.py | 256 + .../python3.6/site-packages/jinja2/bccache.py | 362 + .../site-packages/jinja2/compiler.py | 1721 ++++ .../site-packages/jinja2/constants.py | 32 + .../python3.6/site-packages/jinja2/debug.py | 372 + .../site-packages/jinja2/defaults.py | 56 + .../site-packages/jinja2/environment.py | 1276 +++ .../site-packages/jinja2/exceptions.py | 146 + .../lib/python3.6/site-packages/jinja2/ext.py | 627 ++ .../python3.6/site-packages/jinja2/filters.py | 1190 +++ .../site-packages/jinja2/idtracking.py | 286 + .../python3.6/site-packages/jinja2/lexer.py | 739 ++ .../python3.6/site-packages/jinja2/loaders.py | 481 + .../python3.6/site-packages/jinja2/meta.py | 106 + .../site-packages/jinja2/nativetypes.py | 220 + .../python3.6/site-packages/jinja2/nodes.py | 999 ++ .../site-packages/jinja2/optimizer.py | 49 + .../python3.6/site-packages/jinja2/parser.py | 903 ++ .../python3.6/site-packages/jinja2/runtime.py | 813 ++ .../python3.6/site-packages/jinja2/sandbox.py | 475 + .../python3.6/site-packages/jinja2/tests.py | 175 + .../python3.6/site-packages/jinja2/utils.py | 647 ++ .../python3.6/site-packages/jinja2/visitor.py | 87 + .../site-packages/markupsafe/__init__.py | 327 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 10974 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 766 bytes .../__pycache__/_constants.cpython-36.pyc | Bin 0 -> 4266 bytes .../__pycache__/_native.cpython-36.pyc | Bin 0 -> 2118 bytes .../site-packages/markupsafe/_compat.py | 33 + .../site-packages/markupsafe/_constants.py | 264 + .../site-packages/markupsafe/_native.py | 69 + .../site-packages/markupsafe/_speedups.c | 420 + .../_speedups.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 38555 bytes .../pip-9.0.1.dist-info/DESCRIPTION.rst | 39 + .../pip-9.0.1.dist-info/INSTALLER | 1 + .../pip-9.0.1.dist-info/METADATA | 70 + .../site-packages/pip-9.0.1.dist-info/RECORD | 123 + .../site-packages/pip-9.0.1.dist-info/WHEEL | 6 + .../pip-9.0.1.dist-info/entry_points.txt | 5 + .../pip-9.0.1.dist-info/metadata.json | 1 + .../pip-9.0.1.dist-info/top_level.txt | 1 + .../python3.6/site-packages/pip/__init__.py | 338 + .../python3.6/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 8498 bytes .../pip/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 374 bytes .../__pycache__/basecommand.cpython-36.pyc | Bin 0 -> 7210 bytes .../pip/__pycache__/baseparser.cpython-36.pyc | Bin 0 -> 9271 bytes .../pip/__pycache__/cmdoptions.cpython-36.pyc | Bin 0 -> 12929 bytes .../pip/__pycache__/download.cpython-36.pyc | Bin 0 -> 20310 bytes .../pip/__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10483 bytes .../pip/__pycache__/index.cpython-36.pyc | Bin 0 -> 30233 bytes .../pip/__pycache__/locations.cpython-36.pyc | Bin 0 -> 3869 bytes .../pip/__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 7464 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 338 bytes .../pip/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 21655 bytes .../site-packages/pip/_vendor/__init__.py | 111 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2797 bytes .../site-packages/pip/basecommand.py | 337 + .../python3.6/site-packages/pip/baseparser.py | 293 + .../python3.6/site-packages/pip/cmdoptions.py | 633 ++ .../site-packages/pip/commands/__init__.py | 86 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2028 bytes .../commands/__pycache__/check.cpython-36.pyc | Bin 0 -> 1269 bytes .../__pycache__/completion.cpython-36.pyc | Bin 0 -> 2600 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 5385 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2582 bytes .../commands/__pycache__/hash.cpython-36.pyc | Bin 0 -> 1923 bytes .../commands/__pycache__/help.cpython-36.pyc | Bin 0 -> 1074 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 10221 bytes .../commands/__pycache__/list.cpython-36.pyc | Bin 0 -> 9685 bytes .../__pycache__/search.cpython-36.pyc | Bin 0 -> 4164 bytes .../commands/__pycache__/show.cpython-36.pyc | Bin 0 -> 5335 bytes .../__pycache__/uninstall.cpython-36.pyc | Bin 0 -> 2560 bytes .../commands/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 5422 bytes .../site-packages/pip/commands/check.py | 39 + .../site-packages/pip/commands/completion.py | 81 + .../site-packages/pip/commands/download.py | 212 + .../site-packages/pip/commands/freeze.py | 87 + .../site-packages/pip/commands/hash.py | 57 + .../site-packages/pip/commands/help.py | 35 + .../site-packages/pip/commands/install.py | 455 + .../site-packages/pip/commands/list.py | 337 + .../site-packages/pip/commands/search.py | 133 + .../site-packages/pip/commands/show.py | 154 + .../site-packages/pip/commands/uninstall.py | 76 + .../site-packages/pip/commands/wheel.py | 208 + .../site-packages/pip/compat/__init__.py | 164 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3957 bytes .../__pycache__/dictconfig.cpython-36.pyc | Bin 0 -> 13604 bytes .../site-packages/pip/compat/dictconfig.py | 565 ++ .../python3.6/site-packages/pip/download.py | 906 ++ .../python3.6/site-packages/pip/exceptions.py | 244 + venv/lib/python3.6/site-packages/pip/index.py | 1102 +++ .../python3.6/site-packages/pip/locations.py | 182 + .../site-packages/pip/models/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 223 bytes .../models/__pycache__/index.cpython-36.pyc | Bin 0 -> 827 bytes .../site-packages/pip/models/index.py | 16 + .../site-packages/pip/operations/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 137 bytes .../__pycache__/check.cpython-36.pyc | Bin 0 -> 1424 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2881 bytes .../site-packages/pip/operations/check.py | 49 + .../site-packages/pip/operations/freeze.py | 132 + .../python3.6/site-packages/pip/pep425tags.py | 324 + .../site-packages/pip/req/__init__.py | 10 + .../req/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 404 bytes .../req/__pycache__/req_file.cpython-36.pyc | Bin 0 -> 8419 bytes .../__pycache__/req_install.cpython-36.pyc | Bin 0 -> 30120 bytes .../req/__pycache__/req_set.cpython-36.pyc | Bin 0 -> 20967 bytes .../__pycache__/req_uninstall.cpython-36.pyc | Bin 0 -> 6282 bytes .../site-packages/pip/req/req_file.py | 342 + .../site-packages/pip/req/req_install.py | 1204 +++ .../site-packages/pip/req/req_set.py | 798 ++ .../site-packages/pip/req/req_uninstall.py | 195 + .../site-packages/pip/status_codes.py | 8 + .../site-packages/pip/utils/__init__.py | 870 ++ .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 22743 bytes .../utils/__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 7701 bytes .../utils/__pycache__/build.cpython-36.pyc | Bin 0 -> 1315 bytes .../__pycache__/deprecation.cpython-36.pyc | Bin 0 -> 1728 bytes .../utils/__pycache__/encoding.cpython-36.pyc | Bin 0 -> 1018 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 0 -> 583 bytes .../utils/__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1366 bytes .../utils/__pycache__/hashes.cpython-36.pyc | Bin 0 -> 3242 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 0 -> 3898 bytes .../utils/__pycache__/outdated.cpython-36.pyc | Bin 0 -> 4223 bytes .../__pycache__/packaging.cpython-36.pyc | Bin 0 -> 1986 bytes .../setuptools_build.cpython-36.pyc | Bin 0 -> 327 bytes .../pip/utils/__pycache__/ui.cpython-36.pyc | Bin 0 -> 9583 bytes .../site-packages/pip/utils/appdirs.py | 248 + .../site-packages/pip/utils/build.py | 42 + .../site-packages/pip/utils/deprecation.py | 76 + .../site-packages/pip/utils/encoding.py | 31 + .../site-packages/pip/utils/filesystem.py | 28 + .../site-packages/pip/utils/glibc.py | 81 + .../site-packages/pip/utils/hashes.py | 92 + .../site-packages/pip/utils/logging.py | 130 + .../site-packages/pip/utils/outdated.py | 162 + .../site-packages/pip/utils/packaging.py | 63 + .../pip/utils/setuptools_build.py | 8 + .../python3.6/site-packages/pip/utils/ui.py | 344 + .../site-packages/pip/vcs/__init__.py | 366 + .../vcs/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 11102 bytes .../pip/vcs/__pycache__/bazaar.cpython-36.pyc | Bin 0 -> 3655 bytes .../pip/vcs/__pycache__/git.cpython-36.pyc | Bin 0 -> 8795 bytes .../vcs/__pycache__/mercurial.cpython-36.pyc | Bin 0 -> 3568 bytes .../vcs/__pycache__/subversion.cpython-36.pyc | Bin 0 -> 7107 bytes .../python3.6/site-packages/pip/vcs/bazaar.py | 116 + .../python3.6/site-packages/pip/vcs/git.py | 300 + .../site-packages/pip/vcs/mercurial.py | 103 + .../site-packages/pip/vcs/subversion.py | 269 + venv/lib/python3.6/site-packages/pip/wheel.py | 853 ++ .../DESCRIPTION.rst | 3 + .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 + .../pkg_resources-0.0.0.dist-info/METADATA | 13 + .../pkg_resources-0.0.0.dist-info/RECORD | 38 + .../pkg_resources-0.0.0.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../site-packages/pkg_resources/__init__.py | 3125 +++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 95310 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 657 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 154 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 18580 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 201076 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24451 bytes .../pkg_resources/_vendor/appdirs.py | 552 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 690 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 528 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 975 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2832 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8855 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3851 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19794 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 459 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10569 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5696 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2385 bytes .../site-packages/pkg_resources/py31compat.py | 22 + .../protobuf-3.6.1-py3.6-nspkg.pth | 1 + .../protobuf-3.6.1.dist-info/INSTALLER | 1 + .../protobuf-3.6.1.dist-info/METADATA | 22 + .../protobuf-3.6.1.dist-info/RECORD | 199 + .../protobuf-3.6.1.dist-info/WHEEL | 5 + .../namespace_packages.txt | 1 + .../protobuf-3.6.1.dist-info/top_level.txt | 1 + .../pyasn1-0.4.4.dist-info/DESCRIPTION.rst | 3 + .../pyasn1-0.4.4.dist-info/INSTALLER | 1 + .../pyasn1-0.4.4.dist-info/LICENSE.txt | 24 + .../pyasn1-0.4.4.dist-info/METADATA | 37 + .../pyasn1-0.4.4.dist-info/RECORD | 81 + .../pyasn1-0.4.4.dist-info/WHEEL | 6 + .../pyasn1-0.4.4.dist-info/metadata.json | 1 + .../pyasn1-0.4.4.dist-info/top_level.txt | 1 + .../pyasn1-0.4.4.dist-info/zip-safe | 1 + .../site-packages/pyasn1/__init__.py | 7 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 290 bytes .../pyasn1/__pycache__/debug.cpython-36.pyc | Bin 0 -> 4061 bytes .../pyasn1/__pycache__/error.cpython-36.pyc | Bin 0 -> 1017 bytes .../site-packages/pyasn1/codec/__init__.py | 1 + .../codec/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 138 bytes .../pyasn1/codec/ber/__init__.py | 1 + .../ber/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 142 bytes .../ber/__pycache__/decoder.cpython-36.pyc | Bin 0 -> 27110 bytes .../ber/__pycache__/encoder.cpython-36.pyc | Bin 0 -> 13839 bytes .../codec/ber/__pycache__/eoo.cpython-36.pyc | Bin 0 -> 743 bytes .../site-packages/pyasn1/codec/ber/decoder.py | 1379 +++ .../site-packages/pyasn1/codec/ber/encoder.py | 721 ++ .../site-packages/pyasn1/codec/ber/eoo.py | 28 + .../pyasn1/codec/cer/__init__.py | 1 + .../cer/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 142 bytes .../cer/__pycache__/decoder.cpython-36.pyc | Bin 0 -> 1573 bytes .../cer/__pycache__/encoder.cpython-36.pyc | Bin 0 -> 6154 bytes .../site-packages/pyasn1/codec/cer/decoder.py | 114 + .../site-packages/pyasn1/codec/cer/encoder.py | 296 + .../pyasn1/codec/der/__init__.py | 1 + .../der/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 142 bytes .../der/__pycache__/decoder.cpython-36.pyc | Bin 0 -> 1065 bytes .../der/__pycache__/encoder.cpython-36.pyc | Bin 0 -> 1571 bytes .../site-packages/pyasn1/codec/der/decoder.py | 94 + .../site-packages/pyasn1/codec/der/encoder.py | 107 + .../pyasn1/codec/native/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 145 bytes .../native/__pycache__/decoder.cpython-36.pyc | Bin 0 -> 4500 bytes .../native/__pycache__/encoder.cpython-36.pyc | Bin 0 -> 6753 bytes .../pyasn1/codec/native/decoder.py | 214 + .../pyasn1/codec/native/encoder.py | 255 + .../site-packages/pyasn1/compat/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 139 bytes .../compat/__pycache__/binary.cpython-36.pyc | Bin 0 -> 539 bytes .../compat/__pycache__/calling.cpython-36.pyc | Bin 0 -> 430 bytes .../__pycache__/dateandtime.cpython-36.pyc | Bin 0 -> 550 bytes .../compat/__pycache__/integer.cpython-36.pyc | Bin 0 -> 2263 bytes .../compat/__pycache__/octets.cpython-36.pyc | Bin 0 -> 1900 bytes .../compat/__pycache__/string.cpython-36.pyc | Bin 0 -> 538 bytes .../site-packages/pyasn1/compat/binary.py | 33 + .../site-packages/pyasn1/compat/calling.py | 20 + .../pyasn1/compat/dateandtime.py | 22 + .../site-packages/pyasn1/compat/integer.py | 110 + .../site-packages/pyasn1/compat/octets.py | 46 + .../site-packages/pyasn1/compat/string.py | 26 + .../python3.6/site-packages/pyasn1/debug.py | 145 + .../python3.6/site-packages/pyasn1/error.py | 29 + .../site-packages/pyasn1/type/__init__.py | 1 + .../type/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 137 bytes .../type/__pycache__/base.cpython-36.pyc | Bin 0 -> 21493 bytes .../type/__pycache__/char.cpython-36.pyc | Bin 0 -> 7995 bytes .../__pycache__/constraint.cpython-36.pyc | Bin 0 -> 17672 bytes .../type/__pycache__/error.cpython-36.pyc | Bin 0 -> 347 bytes .../type/__pycache__/namedtype.cpython-36.pyc | Bin 0 -> 19085 bytes .../type/__pycache__/namedval.cpython-36.pyc | Bin 0 -> 5496 bytes .../type/__pycache__/opentype.cpython-36.pyc | Bin 0 -> 2331 bytes .../type/__pycache__/tag.cpython-36.pyc | Bin 0 -> 10322 bytes .../type/__pycache__/tagmap.cpython-36.pyc | Bin 0 -> 3282 bytes .../type/__pycache__/univ.cpython-36.pyc | Bin 0 -> 88602 bytes .../type/__pycache__/useful.cpython-36.pyc | Bin 0 -> 4639 bytes .../site-packages/pyasn1/type/base.py | 643 ++ .../site-packages/pyasn1/type/char.py | 321 + .../site-packages/pyasn1/type/constraint.py | 556 ++ .../site-packages/pyasn1/type/error.py | 11 + .../site-packages/pyasn1/type/namedtype.py | 559 ++ .../site-packages/pyasn1/type/namedval.py | 191 + .../site-packages/pyasn1/type/opentype.py | 75 + .../site-packages/pyasn1/type/tag.py | 333 + .../site-packages/pyasn1/type/tagmap.py | 96 + .../site-packages/pyasn1/type/univ.py | 3061 ++++++ .../site-packages/pyasn1/type/useful.py | 191 + .../DESCRIPTION.rst | 3 + .../pyasn1_modules-0.2.2.dist-info/INSTALLER | 1 + .../LICENSE.txt | 24 + .../pyasn1_modules-0.2.2.dist-info/METADATA | 39 + .../pyasn1_modules-0.2.2.dist-info/RECORD | 65 + .../pyasn1_modules-0.2.2.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../pyasn1_modules-0.2.2.dist-info/zip-safe | 1 + .../site-packages/pyasn1_modules/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 169 bytes .../__pycache__/pem.cpython-36.pyc | Bin 0 -> 2095 bytes .../__pycache__/rfc1155.cpython-36.pyc | Bin 0 -> 2866 bytes .../__pycache__/rfc1157.cpython-36.pyc | Bin 0 -> 4188 bytes .../__pycache__/rfc1901.cpython-36.pyc | Bin 0 -> 643 bytes .../__pycache__/rfc1902.cpython-36.pyc | Bin 0 -> 3973 bytes .../__pycache__/rfc1905.cpython-36.pyc | Bin 0 -> 4923 bytes .../__pycache__/rfc2251.cpython-36.pyc | Bin 0 -> 20458 bytes .../__pycache__/rfc2314.cpython-36.pyc | Bin 0 -> 1592 bytes .../__pycache__/rfc2315.cpython-36.pyc | Bin 0 -> 9822 bytes .../__pycache__/rfc2437.cpython-36.pyc | Bin 0 -> 2157 bytes .../__pycache__/rfc2459.cpython-36.pyc | Bin 0 -> 42184 bytes .../__pycache__/rfc2511.cpython-36.pyc | Bin 0 -> 8966 bytes .../__pycache__/rfc2560.cpython-36.pyc | Bin 0 -> 7843 bytes .../__pycache__/rfc2986.cpython-36.pyc | Bin 0 -> 3184 bytes .../__pycache__/rfc3279.cpython-36.pyc | Bin 0 -> 6359 bytes .../__pycache__/rfc3280.cpython-36.pyc | Bin 0 -> 35091 bytes .../__pycache__/rfc3281.cpython-36.pyc | Bin 0 -> 7408 bytes .../__pycache__/rfc3412.cpython-36.pyc | Bin 0 -> 1690 bytes .../__pycache__/rfc3414.cpython-36.pyc | Bin 0 -> 892 bytes .../__pycache__/rfc3447.cpython-36.pyc | Bin 0 -> 1406 bytes .../__pycache__/rfc3852.cpython-36.pyc | Bin 0 -> 16436 bytes .../__pycache__/rfc4210.cpython-36.pyc | Bin 0 -> 23615 bytes .../__pycache__/rfc4211.cpython-36.pyc | Bin 0 -> 8971 bytes .../__pycache__/rfc5208.cpython-36.pyc | Bin 0 -> 1972 bytes .../__pycache__/rfc5280.cpython-36.pyc | Bin 0 -> 36098 bytes .../__pycache__/rfc5652.cpython-36.pyc | Bin 0 -> 16436 bytes .../__pycache__/rfc6402.cpython-36.pyc | Bin 0 -> 12101 bytes .../site-packages/pyasn1_modules/pem.py | 65 + .../site-packages/pyasn1_modules/rfc1155.py | 96 + .../site-packages/pyasn1_modules/rfc1157.py | 126 + .../site-packages/pyasn1_modules/rfc1901.py | 22 + .../site-packages/pyasn1_modules/rfc1902.py | 129 + .../site-packages/pyasn1_modules/rfc1905.py | 135 + .../site-packages/pyasn1_modules/rfc2251.py | 563 ++ .../site-packages/pyasn1_modules/rfc2314.py | 48 + .../site-packages/pyasn1_modules/rfc2315.py | 294 + .../site-packages/pyasn1_modules/rfc2437.py | 69 + .../site-packages/pyasn1_modules/rfc2459.py | 1337 +++ .../site-packages/pyasn1_modules/rfc2511.py | 258 + .../site-packages/pyasn1_modules/rfc2560.py | 225 + .../site-packages/pyasn1_modules/rfc2986.py | 124 + .../site-packages/pyasn1_modules/rfc3279.py | 233 + .../site-packages/pyasn1_modules/rfc3280.py | 1543 ++++ .../site-packages/pyasn1_modules/rfc3281.py | 331 + .../site-packages/pyasn1_modules/rfc3412.py | 53 + .../site-packages/pyasn1_modules/rfc3414.py | 28 + .../site-packages/pyasn1_modules/rfc3447.py | 45 + .../site-packages/pyasn1_modules/rfc3852.py | 706 ++ .../site-packages/pyasn1_modules/rfc4210.py | 797 ++ .../site-packages/pyasn1_modules/rfc4211.py | 396 + .../site-packages/pyasn1_modules/rfc5208.py | 56 + .../site-packages/pyasn1_modules/rfc5280.py | 1617 ++++ .../site-packages/pyasn1_modules/rfc5652.py | 706 ++ .../site-packages/pyasn1_modules/rfc6402.py | 567 ++ .../pytz-2018.7.dist-info/DESCRIPTION.rst | 589 ++ .../pytz-2018.7.dist-info/INSTALLER | 1 + .../pytz-2018.7.dist-info/LICENSE.txt | 19 + .../pytz-2018.7.dist-info/METADATA | 623 ++ .../pytz-2018.7.dist-info/RECORD | 619 ++ .../site-packages/pytz-2018.7.dist-info/WHEEL | 6 + .../pytz-2018.7.dist-info/metadata.json | 1 + .../pytz-2018.7.dist-info/top_level.txt | 1 + .../pytz-2018.7.dist-info/zip-safe | 1 + .../python3.6/site-packages/pytz/__init__.py | 1527 +++ .../pytz/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 28978 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 1816 bytes .../pytz/__pycache__/lazy.cpython-36.pyc | Bin 0 -> 5234 bytes .../pytz/__pycache__/reference.cpython-36.pyc | Bin 0 -> 3853 bytes .../pytz/__pycache__/tzfile.cpython-36.pyc | Bin 0 -> 3089 bytes .../pytz/__pycache__/tzinfo.cpython-36.pyc | Bin 0 -> 14911 bytes .../site-packages/pytz/exceptions.py | 48 + venv/lib/python3.6/site-packages/pytz/lazy.py | 172 + .../python3.6/site-packages/pytz/reference.py | 140 + .../python3.6/site-packages/pytz/tzfile.py | 134 + .../python3.6/site-packages/pytz/tzinfo.py | 577 ++ .../pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 156 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 0 -> 828 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 0 -> 751 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 0 -> 271 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 0 -> 271 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 0 -> 156 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 0 -> 156 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 0 -> 194 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 0 -> 1963 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2050 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 0 -> 156 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 0 -> 156 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 271 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 839 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 0 -> 156 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 262 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 0 -> 669 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 699 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 0 -> 156 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 0 -> 157 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 0 -> 262 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 262 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 224 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 271 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 211 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 156 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 156 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 157 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 225 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 156 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 641 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 0 -> 701 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 979 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Anchorage | Bin 0 -> 2371 bytes .../pytz/zoneinfo/America/Anguilla | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Antigua | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Araguaina | Bin 0 -> 896 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1100 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1072 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1114 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1100 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1072 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1114 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1130 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1128 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1100 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 0 -> 198 bytes .../pytz/zoneinfo/America/Asuncion | Bin 0 -> 2068 bytes .../pytz/zoneinfo/America/Atikokan | Bin 0 -> 336 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 0 -> 1036 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1574 bytes .../pytz/zoneinfo/America/Barbados | Bin 0 -> 330 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 0 -> 588 bytes .../pytz/zoneinfo/America/Belize | Bin 0 -> 964 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 298 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 644 bytes .../pytz/zoneinfo/America/Bogota | Bin 0 -> 262 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 0 -> 2394 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2084 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 2002 bytes .../pytz/zoneinfo/America/Cancun | Bin 0 -> 802 bytes .../pytz/zoneinfo/America/Caracas | Bin 0 -> 280 bytes .../pytz/zoneinfo/America/Catamarca | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Cayenne | Bin 0 -> 210 bytes .../pytz/zoneinfo/America/Cayman | Bin 0 -> 194 bytes .../pytz/zoneinfo/America/Chicago | Bin 0 -> 3576 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1508 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 336 bytes .../pytz/zoneinfo/America/Cordoba | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 332 bytes .../pytz/zoneinfo/America/Creston | Bin 0 -> 224 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1974 bytes .../pytz/zoneinfo/America/Curacao | Bin 0 -> 198 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 698 bytes .../pytz/zoneinfo/America/Dawson | Bin 0 -> 2084 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1050 bytes .../pytz/zoneinfo/America/Denver | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Detroit | Bin 0 -> 2174 bytes .../pytz/zoneinfo/America/Dominica | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Edmonton | Bin 0 -> 2388 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 0 -> 676 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 0 -> 236 bytes .../pytz/zoneinfo/America/Ensenada | Bin 0 -> 2342 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 0 -> 2240 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 0 -> 728 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2192 bytes .../pytz/zoneinfo/America/Godthab | Bin 0 -> 1878 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3210 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1872 bytes .../pytz/zoneinfo/America/Grenada | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Guatemala | Bin 0 -> 292 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 0 -> 262 bytes .../pytz/zoneinfo/America/Guyana | Bin 0 -> 252 bytes .../pytz/zoneinfo/America/Halifax | Bin 0 -> 3424 bytes .../pytz/zoneinfo/America/Havana | Bin 0 -> 2428 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 0 -> 440 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2428 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1722 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1904 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1726 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1414 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1694 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1778 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Inuvik | Bin 0 -> 1914 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2032 bytes .../pytz/zoneinfo/America/Jamaica | Bin 0 -> 498 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 0 -> 1072 bytes .../pytz/zoneinfo/America/Juneau | Bin 0 -> 2353 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2772 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2352 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2428 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 0 -> 198 bytes .../pytz/zoneinfo/America/La_Paz | Bin 0 -> 248 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 0 -> 422 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2836 bytes .../pytz/zoneinfo/America/Louisville | Bin 0 -> 2772 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 198 bytes .../pytz/zoneinfo/America/Maceio | Bin 0 -> 756 bytes .../pytz/zoneinfo/America/Managua | Bin 0 -> 454 bytes .../pytz/zoneinfo/America/Manaus | Bin 0 -> 616 bytes .../pytz/zoneinfo/America/Marigot | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Martinique | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Matamoros | Bin 0 -> 1402 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1550 bytes .../pytz/zoneinfo/America/Mendoza | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Menominee | Bin 0 -> 2274 bytes .../pytz/zoneinfo/America/Merida | Bin 0 -> 1442 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 0 -> 1409 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1604 bytes .../pytz/zoneinfo/America/Miquelon | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Moncton | Bin 0 -> 3154 bytes .../pytz/zoneinfo/America/Monterrey | Bin 0 -> 1402 bytes .../pytz/zoneinfo/America/Montevideo | Bin 0 -> 1550 bytes .../pytz/zoneinfo/America/Montreal | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Montserrat | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Nassau | Bin 0 -> 2270 bytes .../pytz/zoneinfo/America/New_York | Bin 0 -> 3536 bytes .../pytz/zoneinfo/America/Nipigon | Bin 0 -> 2122 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 0 -> 2367 bytes .../pytz/zoneinfo/America/Noronha | Bin 0 -> 728 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2380 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2380 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2380 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1508 bytes .../pytz/zoneinfo/America/Panama | Bin 0 -> 194 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2094 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 0 -> 282 bytes .../pytz/zoneinfo/America/Phoenix | Bin 0 -> 344 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1446 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 648 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 588 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 0 -> 1902 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2122 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 1916 bytes .../pytz/zoneinfo/America/Recife | Bin 0 -> 728 bytes .../pytz/zoneinfo/America/Regina | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Resolute | Bin 0 -> 1916 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 648 bytes .../pytz/zoneinfo/America/Rosario | Bin 0 -> 1100 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2342 bytes .../pytz/zoneinfo/America/Santarem | Bin 0 -> 618 bytes .../pytz/zoneinfo/America/Santiago | Bin 0 -> 2529 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 482 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 2002 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1916 bytes .../pytz/zoneinfo/America/Shiprock | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 0 -> 2329 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/St_Johns | Bin 0 -> 3655 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 0 -> 560 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 264 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 0 -> 1514 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Tijuana | Bin 0 -> 2342 bytes .../pytz/zoneinfo/America/Toronto | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tortola | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Vancouver | Bin 0 -> 2892 bytes .../pytz/zoneinfo/America/Virgin | Bin 0 -> 156 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 0 -> 2084 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2882 bytes .../pytz/zoneinfo/America/Yakutat | Bin 0 -> 2305 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 0 -> 1966 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 297 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 297 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 202 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 1534 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 211 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2451 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 1418 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 172 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2451 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 173 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 0 -> 1162 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 173 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2242 bytes .../site-packages/pytz/zoneinfo/Asia/Aden | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 0 -> 1017 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 0 -> 1863 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1208 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 1003 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 1033 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 637 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 637 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 0 -> 1011 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 995 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 211 bytes .../site-packages/pytz/zoneinfo/Asia/Baku | Bin 0 -> 1255 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 211 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 0 -> 1241 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2166 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 999 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 0 -> 215 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 303 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1243 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 977 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 545 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 545 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 0 -> 404 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 0 -> 361 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 0 -> 2306 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 361 bytes .../site-packages/pytz/zoneinfo/Asia/Dili | Bin 0 -> 239 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 607 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 0 -> 2028 bytes .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin 0 -> 2286 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 0 -> 545 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 0 -> 2314 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 375 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1175 bytes .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin 0 -> 907 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1267 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 2157 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 383 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 237 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 2256 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 0 -> 220 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1184 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 0 -> 403 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 173 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 224 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 224 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1297 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 303 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1229 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 415 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 0 -> 507 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 0 -> 1241 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 0 -> 1241 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1244 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 0 -> 274 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 0 -> 350 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2002 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1183 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1241 bytes .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Oral | Bin 0 -> 1025 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 211 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 381 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 253 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 0 -> 211 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1017 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 288 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 0 -> 375 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1220 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 605 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 0 -> 517 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 545 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 0 -> 415 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1230 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 0 -> 781 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 621 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1071 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 0 -> 1704 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2256 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 215 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 215 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 0 -> 1241 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 274 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 907 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 907 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1276 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 211 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1230 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 0 -> 288 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1267 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1199 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3484 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 1990 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1897 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 270 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2242 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3475 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 1174 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 172 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 156 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1242 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 0 -> 2214 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2233 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 443 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2269 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2214 bytes .../pytz/zoneinfo/Australia/Currie | Bin 0 -> 2214 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 0 -> 318 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 0 -> 494 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2326 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 0 -> 1880 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 513 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1880 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2214 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 0 -> 2214 bytes .../pytz/zoneinfo/Australia/North | Bin 0 -> 318 bytes .../pytz/zoneinfo/Australia/Perth | Bin 0 -> 470 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 0 -> 443 bytes .../pytz/zoneinfo/Australia/South | Bin 0 -> 2233 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2214 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2326 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2214 bytes .../pytz/zoneinfo/Australia/West | Bin 0 -> 470 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2269 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 0 -> 648 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 728 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 0 -> 2002 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 0 -> 616 bytes .../python3.6/site-packages/pytz/zoneinfo/CET | Bin 0 -> 2102 bytes .../site-packages/pytz/zoneinfo/CST6CDT | Bin 0 -> 2294 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3424 bytes .../pytz/zoneinfo/Canada/Central | Bin 0 -> 2882 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3494 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2388 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3655 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2892 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 980 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 0 -> 2084 bytes .../pytz/zoneinfo/Chile/Continental | Bin 0 -> 2529 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 2233 bytes .../site-packages/pytz/zoneinfo/Cuba | Bin 0 -> 2428 bytes .../python3.6/site-packages/pytz/zoneinfo/EET | Bin 0 -> 1876 bytes .../python3.6/site-packages/pytz/zoneinfo/EST | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/EST5EDT | Bin 0 -> 2294 bytes .../site-packages/pytz/zoneinfo/Egypt | Bin 0 -> 1963 bytes .../site-packages/pytz/zoneinfo/Eire | Bin 0 -> 3522 bytes .../site-packages/pytz/zoneinfo/Etc/GMT | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 120 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 122 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 122 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 122 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 122 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 122 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 121 bytes .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/UCT | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/UTC | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin 0 -> 118 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2940 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1742 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 0 -> 1183 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 0 -> 2262 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3678 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1948 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2326 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2329 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2961 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2212 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2396 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2436 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2151 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3522 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3052 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3678 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1900 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3678 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 2157 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3678 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1509 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2088 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 0 -> 1153 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3469 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1948 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 0 -> 3678 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2960 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2628 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 0 -> 2620 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1900 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1361 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2944 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1535 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2002 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2242 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 0 -> 2962 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1948 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 0 -> 2329 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 0 -> 2226 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 0 -> 2683 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 0 -> 1215 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2683 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1948 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 0 -> 1183 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 1481 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1948 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2121 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2178 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2084 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2436 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1267 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2094 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2683 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2228 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1183 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2696 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1948 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2106 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1909 bytes .../site-packages/pytz/zoneinfo/Factory | Bin 0 -> 120 bytes .../python3.6/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3678 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3678 bytes .../python3.6/site-packages/pytz/zoneinfo/GMT | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/GMT+0 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/GMT-0 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/GMT0 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Greenwich | Bin 0 -> 118 bytes .../python3.6/site-packages/pytz/zoneinfo/HST | Bin 0 -> 119 bytes .../site-packages/pytz/zoneinfo/Hongkong | Bin 0 -> 1175 bytes .../site-packages/pytz/zoneinfo/Iceland | Bin 0 -> 1174 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 271 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 0 -> 211 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 0 -> 182 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 0 -> 271 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 0 -> 173 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 0 -> 211 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 253 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 271 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 0 -> 173 bytes .../site-packages/pytz/zoneinfo/Iran | Bin 0 -> 1704 bytes .../site-packages/pytz/zoneinfo/Israel | Bin 0 -> 2256 bytes .../site-packages/pytz/zoneinfo/Jamaica | Bin 0 -> 498 bytes .../site-packages/pytz/zoneinfo/Japan | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Kwajalein | Bin 0 -> 250 bytes .../site-packages/pytz/zoneinfo/Libya | Bin 0 -> 641 bytes .../python3.6/site-packages/pytz/zoneinfo/MET | Bin 0 -> 2102 bytes .../python3.6/site-packages/pytz/zoneinfo/MST | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/MST7MDT | Bin 0 -> 2294 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2342 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1550 bytes .../pytz/zoneinfo/Mexico/General | Bin 0 -> 1604 bytes .../python3.6/site-packages/pytz/zoneinfo/NZ | Bin 0 -> 2451 bytes .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2078 bytes .../site-packages/pytz/zoneinfo/Navajo | Bin 0 -> 2444 bytes .../python3.6/site-packages/pytz/zoneinfo/PRC | Bin 0 -> 545 bytes .../site-packages/pytz/zoneinfo/PST8PDT | Bin 0 -> 2294 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 0 -> 1125 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2451 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 286 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2078 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 174 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 0 -> 2233 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 0 -> 478 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 250 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 212 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 1090 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 174 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 254 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 174 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 0 -> 216 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 254 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 242 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 250 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 212 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 181 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 268 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 0 -> 257 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 314 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 314 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 187 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 0 -> 173 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 214 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 174 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 174 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 196 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 593 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 216 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 187 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 173 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 174 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 384 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 0 -> 174 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 0 -> 174 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 174 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 0 -> 174 bytes .../site-packages/pytz/zoneinfo/Poland | Bin 0 -> 2696 bytes .../site-packages/pytz/zoneinfo/Portugal | Bin 0 -> 3469 bytes .../python3.6/site-packages/pytz/zoneinfo/ROC | Bin 0 -> 781 bytes .../python3.6/site-packages/pytz/zoneinfo/ROK | Bin 0 -> 517 bytes .../site-packages/pytz/zoneinfo/Singapore | Bin 0 -> 415 bytes .../site-packages/pytz/zoneinfo/Turkey | Bin 0 -> 2157 bytes .../python3.6/site-packages/pytz/zoneinfo/UCT | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/US/Alaska | Bin 0 -> 2371 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 0 -> 344 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 0 -> 3576 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1666 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 0 -> 3536 bytes .../site-packages/pytz/zoneinfo/US/Hawaii | Bin 0 -> 329 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2428 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 0 -> 2174 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 0 -> 2836 bytes .../site-packages/pytz/zoneinfo/US/Samoa | Bin 0 -> 187 bytes .../python3.6/site-packages/pytz/zoneinfo/UTC | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Universal | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/W-SU | Bin 0 -> 1535 bytes .../python3.6/site-packages/pytz/zoneinfo/WET | Bin 0 -> 1873 bytes .../site-packages/pytz/zoneinfo/Zulu | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 274 + .../site-packages/pytz/zoneinfo/leapseconds | 66 + .../site-packages/pytz/zoneinfo/posixrules | Bin 0 -> 3536 bytes .../site-packages/pytz/zoneinfo/tzdata.zi | 4177 +++++++++ .../site-packages/pytz/zoneinfo/zone.tab | 448 + .../site-packages/pytz/zoneinfo/zone1970.tab | 382 + .../requests-2.21.0.dist-info/INSTALLER | 1 + .../requests-2.21.0.dist-info/LICENSE | 13 + .../requests-2.21.0.dist-info/METADATA | 146 + .../requests-2.21.0.dist-info/RECORD | 42 + .../requests-2.21.0.dist-info/WHEEL | 6 + .../requests-2.21.0.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 131 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3308 bytes .../__pycache__/__version__.cpython-36.pyc | Bin 0 -> 494 bytes .../_internal_utils.cpython-36.pyc | Bin 0 -> 1252 bytes .../__pycache__/adapters.cpython-36.pyc | Bin 0 -> 16771 bytes .../requests/__pycache__/api.cpython-36.pyc | Bin 0 -> 6435 bytes .../requests/__pycache__/auth.cpython-36.pyc | Bin 0 -> 8286 bytes .../requests/__pycache__/certs.cpython-36.pyc | Bin 0 -> 565 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 1599 bytes .../__pycache__/cookies.cpython-36.pyc | Bin 0 -> 18731 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 5439 bytes .../requests/__pycache__/help.cpython-36.pyc | Bin 0 -> 2572 bytes .../requests/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 924 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 24034 bytes .../__pycache__/packages.cpython-36.pyc | Bin 0 -> 376 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 19370 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 4722 bytes .../__pycache__/structures.cpython-36.pyc | Bin 0 -> 4323 bytes .../requests/__pycache__/utils.cpython-36.pyc | Bin 0 -> 22104 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 533 ++ .../python3.6/site-packages/requests/api.py | 158 + .../python3.6/site-packages/requests/auth.py | 305 + .../python3.6/site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 70 + .../site-packages/requests/cookies.py | 549 ++ .../site-packages/requests/exceptions.py | 126 + .../python3.6/site-packages/requests/help.py | 119 + .../python3.6/site-packages/requests/hooks.py | 34 + .../site-packages/requests/models.py | 953 ++ .../site-packages/requests/packages.py | 14 + .../site-packages/requests/sessions.py | 770 ++ .../site-packages/requests/status_codes.py | 120 + .../site-packages/requests/structures.py | 103 + .../python3.6/site-packages/requests/utils.py | 977 ++ .../rsa-4.0.dist-info/DESCRIPTION.rst | 45 + .../site-packages/rsa-4.0.dist-info/INSTALLER | 1 + .../rsa-4.0.dist-info/LICENSE.txt | 13 + .../site-packages/rsa-4.0.dist-info/METADATA | 76 + .../site-packages/rsa-4.0.dist-info/RECORD | 47 + .../site-packages/rsa-4.0.dist-info/WHEEL | 6 + .../rsa-4.0.dist-info/entry_points.txt | 8 + .../rsa-4.0.dist-info/metadata.json | 1 + .../rsa-4.0.dist-info/top_level.txt | 1 + .../python3.6/site-packages/rsa/__init__.py | 42 + .../rsa/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1040 bytes .../rsa/__pycache__/_compat.cpython-36.pyc | Bin 0 -> 3826 bytes .../rsa/__pycache__/asn1.cpython-36.pyc | Bin 0 -> 1360 bytes .../rsa/__pycache__/cli.cpython-36.pyc | Bin 0 -> 8118 bytes .../rsa/__pycache__/common.cpython-36.pyc | Bin 0 -> 3929 bytes .../rsa/__pycache__/core.cpython-36.pyc | Bin 0 -> 1188 bytes .../rsa/__pycache__/key.cpython-36.pyc | Bin 0 -> 22937 bytes .../__pycache__/machine_size.cpython-36.pyc | Bin 0 -> 1435 bytes .../rsa/__pycache__/parallel.cpython-36.pyc | Bin 0 -> 1822 bytes .../rsa/__pycache__/pem.cpython-36.pyc | Bin 0 -> 2324 bytes .../rsa/__pycache__/pkcs1.cpython-36.pyc | Bin 0 -> 11714 bytes .../rsa/__pycache__/pkcs1_v2.cpython-36.pyc | Bin 0 -> 2543 bytes .../rsa/__pycache__/prime.cpython-36.pyc | Bin 0 -> 3742 bytes .../rsa/__pycache__/randnum.cpython-36.pyc | Bin 0 -> 1657 bytes .../rsa/__pycache__/transform.cpython-36.pyc | Bin 0 -> 4985 bytes .../rsa/__pycache__/util.cpython-36.pyc | Bin 0 -> 1954 bytes .../python3.6/site-packages/rsa/_compat.py | 162 + venv/lib/python3.6/site-packages/rsa/asn1.py | 53 + venv/lib/python3.6/site-packages/rsa/cli.py | 288 + .../lib/python3.6/site-packages/rsa/common.py | 188 + venv/lib/python3.6/site-packages/rsa/core.py | 57 + venv/lib/python3.6/site-packages/rsa/key.py | 791 ++ .../site-packages/rsa/machine_size.py | 74 + .../python3.6/site-packages/rsa/parallel.py | 101 + venv/lib/python3.6/site-packages/rsa/pem.py | 126 + venv/lib/python3.6/site-packages/rsa/pkcs1.py | 439 + .../python3.6/site-packages/rsa/pkcs1_v2.py | 103 + venv/lib/python3.6/site-packages/rsa/prime.py | 201 + .../python3.6/site-packages/rsa/randnum.py | 98 + .../python3.6/site-packages/rsa/transform.py | 215 + venv/lib/python3.6/site-packages/rsa/util.py | 79 + .../DESCRIPTION.rst | 36 + .../setuptools-39.0.1.dist-info/INSTALLER | 1 + .../setuptools-39.0.1.dist-info/METADATA | 67 + .../setuptools-39.0.1.dist-info/RECORD | 155 + .../setuptools-39.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 64 + .../setuptools-39.0.1.dist-info/metadata.json | 1 + .../setuptools-39.0.1.dist-info/top_level.txt | 3 + .../setuptools-39.0.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 180 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 6246 bytes .../__pycache__/archive_util.cpython-36.pyc | Bin 0 -> 5094 bytes .../__pycache__/build_meta.cpython-36.pyc | Bin 0 -> 5867 bytes .../__pycache__/config.cpython-36.pyc | Bin 0 -> 14323 bytes .../__pycache__/dep_util.cpython-36.pyc | Bin 0 -> 813 bytes .../__pycache__/depends.cpython-36.pyc | Bin 0 -> 5239 bytes .../__pycache__/dist.cpython-36.pyc | Bin 0 -> 36818 bytes .../__pycache__/extension.cpython-36.pyc | Bin 0 -> 1933 bytes .../__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1503 bytes .../__pycache__/glob.cpython-36.pyc | Bin 0 -> 3801 bytes .../__pycache__/launch.cpython-36.pyc | Bin 0 -> 812 bytes .../__pycache__/lib2to3_ex.cpython-36.pyc | Bin 0 -> 2391 bytes .../__pycache__/monkey.cpython-36.pyc | Bin 0 -> 5133 bytes .../__pycache__/msvc.cpython-36.pyc | Bin 0 -> 34498 bytes .../__pycache__/namespaces.cpython-36.pyc | Bin 0 -> 3636 bytes .../__pycache__/package_index.cpython-36.pyc | Bin 0 -> 32218 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 7296 bytes .../__pycache__/py27compat.cpython-36.pyc | Bin 0 -> 769 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 1508 bytes .../__pycache__/py33compat.cpython-36.pyc | Bin 0 -> 1361 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 2165 bytes .../__pycache__/sandbox.cpython-36.pyc | Bin 0 -> 15681 bytes .../__pycache__/site-patch.cpython-36.pyc | Bin 0 -> 1464 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 0 -> 6744 bytes .../__pycache__/unicode_utils.cpython-36.pyc | Bin 0 -> 1127 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 286 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 0 -> 5781 bytes .../windows_support.cpython-36.pyc | Bin 0 -> 969 bytes .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 148 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 201070 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24445 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 684 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 522 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 969 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2826 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8846 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3839 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19788 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 453 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10563 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5696 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 172 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 699 bytes .../command/__pycache__/alias.cpython-36.pyc | Bin 0 -> 2392 bytes .../__pycache__/bdist_egg.cpython-36.pyc | Bin 0 -> 14373 bytes .../__pycache__/bdist_rpm.cpython-36.pyc | Bin 0 -> 1735 bytes .../__pycache__/bdist_wininst.cpython-36.pyc | Bin 0 -> 936 bytes .../__pycache__/build_clib.cpython-36.pyc | Bin 0 -> 2407 bytes .../__pycache__/build_ext.cpython-36.pyc | Bin 0 -> 10006 bytes .../__pycache__/build_py.cpython-36.pyc | Bin 0 -> 8531 bytes .../__pycache__/develop.cpython-36.pyc | Bin 0 -> 6385 bytes .../__pycache__/dist_info.cpython-36.pyc | Bin 0 -> 1352 bytes .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 66239 bytes .../__pycache__/egg_info.cpython-36.pyc | Bin 0 -> 20935 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 3932 bytes .../install_egg_info.cpython-36.pyc | Bin 0 -> 2916 bytes .../__pycache__/install_lib.cpython-36.pyc | Bin 0 -> 5050 bytes .../install_scripts.cpython-36.pyc | Bin 0 -> 2237 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 4582 bytes .../__pycache__/register.cpython-36.pyc | Bin 0 -> 552 bytes .../command/__pycache__/rotate.cpython-36.pyc | Bin 0 -> 2538 bytes .../__pycache__/saveopts.cpython-36.pyc | Bin 0 -> 883 bytes .../command/__pycache__/sdist.cpython-36.pyc | Bin 0 -> 6347 bytes .../command/__pycache__/setopt.cpython-36.pyc | Bin 0 -> 4561 bytes .../command/__pycache__/test.cpython-36.pyc | Bin 0 -> 8120 bytes .../command/__pycache__/upload.cpython-36.pyc | Bin 0 -> 1350 bytes .../__pycache__/upload_docs.cpython-36.pyc | Bin 0 -> 6059 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 331 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 216 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2389 +++++ .../setuptools/command/egg_info.py | 696 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 10 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 200 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 268 + .../setuptools/command/upload.py | 42 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 556 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1070 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2387 bytes .../site-packages/setuptools/glibc.py | 86 + .../site-packages/setuptools/glob.py | 176 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 197 + .../site-packages/setuptools/msvc.py | 1302 +++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1119 +++ .../site-packages/setuptools/pep425tags.py | 316 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 41 + .../site-packages/setuptools/py33compat.py | 54 + .../site-packages/setuptools/py36compat.py | 82 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 5 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 163 + .../setuptools/windows_support.py | 29 + .../six-1.12.0.dist-info/INSTALLER | 1 + .../six-1.12.0.dist-info/LICENSE | 18 + .../six-1.12.0.dist-info/METADATA | 52 + .../site-packages/six-1.12.0.dist-info/RECORD | 8 + .../site-packages/six-1.12.0.dist-info/WHEEL | 6 + .../six-1.12.0.dist-info/top_level.txt | 1 + venv/lib/python3.6/site-packages/six.py | 952 ++ .../urllib3-1.24.1.dist-info/INSTALLER | 1 + .../urllib3-1.24.1.dist-info/LICENSE.txt | 19 + .../urllib3-1.24.1.dist-info/METADATA | 1111 +++ .../urllib3-1.24.1.dist-info/RECORD | 78 + .../urllib3-1.24.1.dist-info/WHEEL | 6 + .../urllib3-1.24.1.dist-info/top_level.txt | 1 + .../site-packages/urllib3/__init__.py | 92 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2144 bytes .../__pycache__/_collections.cpython-36.pyc | Bin 0 -> 10631 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 10084 bytes .../__pycache__/connectionpool.cpython-36.pyc | Bin 0 -> 23606 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10343 bytes .../urllib3/__pycache__/fields.cpython-36.pyc | Bin 0 -> 5813 bytes .../__pycache__/filepost.cpython-36.pyc | Bin 0 -> 2703 bytes .../__pycache__/poolmanager.cpython-36.pyc | Bin 0 -> 12910 bytes .../__pycache__/request.cpython-36.pyc | Bin 0 -> 5525 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 18725 bytes .../site-packages/urllib3/_collections.py | 329 + .../site-packages/urllib3/connection.py | 391 + .../site-packages/urllib3/connectionpool.py | 896 ++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 142 bytes .../_appengine_environ.cpython-36.pyc | Bin 0 -> 1038 bytes .../__pycache__/appengine.cpython-36.pyc | Bin 0 -> 8233 bytes .../__pycache__/ntlmpool.cpython-36.pyc | Bin 0 -> 3184 bytes .../__pycache__/pyopenssl.cpython-36.pyc | Bin 0 -> 14449 bytes .../securetransport.cpython-36.pyc | Bin 0 -> 17837 bytes .../contrib/__pycache__/socks.cpython-36.pyc | Bin 0 -> 4848 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 159 bytes .../__pycache__/bindings.cpython-36.pyc | Bin 0 -> 10374 bytes .../__pycache__/low_level.cpython-36.pyc | Bin 0 -> 7435 bytes .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 346 + .../urllib3/contrib/appengine.py | 289 + .../site-packages/urllib3/contrib/ntlmpool.py | 111 + .../urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 ++ .../site-packages/urllib3/contrib/socks.py | 192 + .../site-packages/urllib3/exceptions.py | 246 + .../python3.6/site-packages/urllib3/fields.py | 178 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 268 bytes .../packages/__pycache__/six.cpython-36.pyc | Bin 0 -> 24440 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 153 bytes .../__pycache__/makefile.cpython-36.pyc | Bin 0 -> 1247 bytes .../urllib3/packages/backports/makefile.py | 53 + .../site-packages/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 529 bytes .../_implementation.cpython-36.pyc | Bin 0 -> 3232 bytes .../ssl_match_hostname/_implementation.py | 156 + .../site-packages/urllib3/poolmanager.py | 450 + .../site-packages/urllib3/request.py | 150 + .../site-packages/urllib3/response.py | 705 ++ .../site-packages/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1072 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 3109 bytes .../util/__pycache__/queue.cpython-36.pyc | Bin 0 -> 983 bytes .../util/__pycache__/request.cpython-36.pyc | Bin 0 -> 3164 bytes .../util/__pycache__/response.cpython-36.pyc | Bin 0 -> 1912 bytes .../util/__pycache__/retry.cpython-36.pyc | Bin 0 -> 12598 bytes .../util/__pycache__/ssl_.cpython-36.pyc | Bin 0 -> 9466 bytes .../util/__pycache__/timeout.cpython-36.pyc | Bin 0 -> 8713 bytes .../util/__pycache__/url.cpython-36.pyc | Bin 0 -> 5132 bytes .../util/__pycache__/wait.cpython-36.pyc | Bin 0 -> 3093 bytes .../site-packages/urllib3/util/connection.py | 134 + .../site-packages/urllib3/util/queue.py | 21 + .../site-packages/urllib3/util/request.py | 118 + .../site-packages/urllib3/util/response.py | 87 + .../site-packages/urllib3/util/retry.py | 411 + .../site-packages/urllib3/util/ssl_.py | 381 + .../site-packages/urllib3/util/timeout.py | 242 + .../site-packages/urllib3/util/url.py | 230 + .../site-packages/urllib3/util/wait.py | 150 + .../site-packages/werkzeug/__init__.py | 151 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 4696 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 7099 bytes .../__pycache__/_internal.cpython-36.pyc | Bin 0 -> 12585 bytes .../__pycache__/_reloader.cpython-36.pyc | Bin 0 -> 8849 bytes .../__pycache__/datastructures.cpython-36.pyc | Bin 0 -> 100036 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 22930 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 0 -> 2207 bytes .../__pycache__/formparser.cpython-36.pyc | Bin 0 -> 16153 bytes .../werkzeug/__pycache__/http.cpython-36.pyc | Bin 0 -> 33459 bytes .../werkzeug/__pycache__/local.cpython-36.pyc | Bin 0 -> 18676 bytes .../__pycache__/posixemulation.cpython-36.pyc | Bin 0 -> 2768 bytes .../__pycache__/routing.cpython-36.pyc | Bin 0 -> 60150 bytes .../__pycache__/script.cpython-36.pyc | Bin 0 -> 10066 bytes .../__pycache__/security.cpython-36.pyc | Bin 0 -> 8518 bytes .../__pycache__/serving.cpython-36.pyc | Bin 0 -> 26502 bytes .../werkzeug/__pycache__/test.cpython-36.pyc | Bin 0 -> 31036 bytes .../__pycache__/testapp.cpython-36.pyc | Bin 0 -> 9425 bytes .../werkzeug/__pycache__/urls.cpython-36.pyc | Bin 0 -> 33310 bytes .../__pycache__/useragents.cpython-36.pyc | Bin 0 -> 6042 bytes .../werkzeug/__pycache__/utils.cpython-36.pyc | Bin 0 -> 21163 bytes .../__pycache__/websocket.cpython-36.pyc | Bin 0 -> 8205 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 0 -> 76410 bytes .../werkzeug/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 44665 bytes .../site-packages/werkzeug/_compat.py | 206 + .../site-packages/werkzeug/_internal.py | 419 + .../site-packages/werkzeug/_reloader.py | 277 + .../werkzeug/contrib/__init__.py | 16 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 751 bytes .../contrib/__pycache__/atom.cpython-36.pyc | Bin 0 -> 14063 bytes .../contrib/__pycache__/cache.cpython-36.pyc | Bin 0 -> 32376 bytes .../contrib/__pycache__/fixers.cpython-36.pyc | Bin 0 -> 10068 bytes .../contrib/__pycache__/iterio.cpython-36.pyc | Bin 0 -> 10950 bytes .../__pycache__/jsrouting.cpython-36.pyc | Bin 0 -> 8259 bytes .../__pycache__/limiter.cpython-36.pyc | Bin 0 -> 1722 bytes .../contrib/__pycache__/lint.cpython-36.pyc | Bin 0 -> 11886 bytes .../__pycache__/profiler.cpython-36.pyc | Bin 0 -> 5248 bytes .../__pycache__/securecookie.cpython-36.pyc | Bin 0 -> 10300 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 12888 bytes .../__pycache__/testtools.cpython-36.pyc | Bin 0 -> 2634 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 0 -> 10379 bytes .../site-packages/werkzeug/contrib/atom.py | 355 + .../site-packages/werkzeug/contrib/cache.py | 913 ++ .../site-packages/werkzeug/contrib/fixers.py | 254 + .../site-packages/werkzeug/contrib/iterio.py | 352 + .../werkzeug/contrib/jsrouting.py | 264 + .../site-packages/werkzeug/contrib/limiter.py | 41 + .../site-packages/werkzeug/contrib/lint.py | 343 + .../werkzeug/contrib/profiler.py | 147 + .../werkzeug/contrib/securecookie.py | 323 + .../werkzeug/contrib/sessions.py | 352 + .../werkzeug/contrib/testtools.py | 73 + .../werkzeug/contrib/wrappers.py | 284 + .../site-packages/werkzeug/datastructures.py | 2762 ++++++ .../site-packages/werkzeug/debug/__init__.py | 470 + .../debug/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 12711 bytes .../debug/__pycache__/console.cpython-36.pyc | Bin 0 -> 7325 bytes .../debug/__pycache__/repr.cpython-36.pyc | Bin 0 -> 8629 bytes .../debug/__pycache__/tbtools.cpython-36.pyc | Bin 0 -> 15647 bytes .../site-packages/werkzeug/debug/console.py | 215 + .../site-packages/werkzeug/debug/repr.py | 280 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 205 + .../werkzeug/debug/shared/jquery.js | 5 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 143 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 556 ++ .../site-packages/werkzeug/exceptions.py | 719 ++ .../site-packages/werkzeug/filesystem.py | 66 + .../site-packages/werkzeug/formparser.py | 534 ++ .../python3.6/site-packages/werkzeug/http.py | 1158 +++ .../python3.6/site-packages/werkzeug/local.py | 420 + .../site-packages/werkzeug/posixemulation.py | 106 + .../site-packages/werkzeug/routing.py | 1792 ++++ .../site-packages/werkzeug/script.py | 318 + .../site-packages/werkzeug/security.py | 270 + .../site-packages/werkzeug/serving.py | 862 ++ .../python3.6/site-packages/werkzeug/test.py | 948 ++ .../site-packages/werkzeug/testapp.py | 230 + .../python3.6/site-packages/werkzeug/urls.py | 1007 ++ .../site-packages/werkzeug/useragents.py | 212 + .../python3.6/site-packages/werkzeug/utils.py | 628 ++ .../site-packages/werkzeug/websocket.py | 337 + .../site-packages/werkzeug/wrappers.py | 2028 ++++ .../python3.6/site-packages/werkzeug/wsgi.py | 1364 +++ .../site-packages/wtforms/__init__.py | 16 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 571 bytes .../wtforms/__pycache__/compat.cpython-36.pyc | Bin 0 -> 925 bytes .../wtforms/__pycache__/form.cpython-36.pyc | Bin 0 -> 11497 bytes .../wtforms/__pycache__/i18n.cpython-36.pyc | Bin 0 -> 2764 bytes .../wtforms/__pycache__/meta.cpython-36.pyc | Bin 0 -> 3804 bytes .../wtforms/__pycache__/utils.cpython-36.pyc | Bin 0 -> 2549 bytes .../__pycache__/validators.cpython-36.pyc | Bin 0 -> 20433 bytes .../python3.6/site-packages/wtforms/compat.py | 32 + .../site-packages/wtforms/csrf/__init__.py | 0 .../csrf/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 139 bytes .../csrf/__pycache__/core.cpython-36.pyc | Bin 0 -> 3926 bytes .../csrf/__pycache__/session.cpython-36.pyc | Bin 0 -> 3291 bytes .../site-packages/wtforms/csrf/core.py | 98 + .../site-packages/wtforms/csrf/session.py | 88 + .../site-packages/wtforms/ext/__init__.py | 0 .../ext/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 138 bytes .../wtforms/ext/appengine/__init__.py | 8 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 404 bytes .../appengine/__pycache__/db.cpython-36.pyc | Bin 0 -> 18665 bytes .../__pycache__/fields.cpython-36.pyc | Bin 0 -> 8158 bytes .../appengine/__pycache__/ndb.cpython-36.pyc | Bin 0 -> 17752 bytes .../site-packages/wtforms/ext/appengine/db.py | 464 + .../wtforms/ext/appengine/fields.py | 215 + .../wtforms/ext/appengine/ndb.py | 418 + .../wtforms/ext/csrf/__init__.py | 1 + .../csrf/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 199 bytes .../csrf/__pycache__/fields.cpython-36.pyc | Bin 0 -> 822 bytes .../ext/csrf/__pycache__/form.cpython-36.pyc | Bin 0 -> 2300 bytes .../csrf/__pycache__/session.cpython-36.pyc | Bin 0 -> 2596 bytes .../site-packages/wtforms/ext/csrf/fields.py | 18 + .../site-packages/wtforms/ext/csrf/form.py | 53 + .../site-packages/wtforms/ext/csrf/session.py | 71 + .../wtforms/ext/dateutil/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 147 bytes .../__pycache__/fields.cpython-36.pyc | Bin 0 -> 3074 bytes .../wtforms/ext/dateutil/fields.py | 97 + .../wtforms/ext/django/__init__.py | 8 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 391 bytes .../django/__pycache__/fields.cpython-36.pyc | Bin 0 -> 5085 bytes .../django/__pycache__/i18n.cpython-36.pyc | Bin 0 -> 1226 bytes .../ext/django/__pycache__/orm.cpython-36.pyc | Bin 0 -> 6612 bytes .../wtforms/ext/django/fields.py | 133 + .../site-packages/wtforms/ext/django/i18n.py | 24 + .../site-packages/wtforms/ext/django/orm.py | 168 + .../ext/django/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 158 bytes .../__pycache__/wtforms.cpython-36.pyc | Bin 0 -> 2907 bytes .../ext/django/templatetags/wtforms.py | 80 + .../wtforms/ext/i18n/__init__.py | 0 .../i18n/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 143 bytes .../ext/i18n/__pycache__/form.cpython-36.pyc | Bin 0 -> 1872 bytes .../ext/i18n/__pycache__/utils.cpython-36.pyc | Bin 0 -> 679 bytes .../site-packages/wtforms/ext/i18n/form.py | 45 + .../site-packages/wtforms/ext/i18n/utils.py | 15 + .../wtforms/ext/sqlalchemy/__init__.py | 10 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 555 bytes .../__pycache__/fields.cpython-36.pyc | Bin 0 -> 7343 bytes .../sqlalchemy/__pycache__/orm.cpython-36.pyc | Bin 0 -> 9897 bytes .../wtforms/ext/sqlalchemy/fields.py | 190 + .../wtforms/ext/sqlalchemy/orm.py | 304 + .../site-packages/wtforms/fields/__init__.py | 7 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 359 bytes .../fields/__pycache__/core.cpython-36.pyc | Bin 0 -> 36047 bytes .../fields/__pycache__/html5.cpython-36.pyc | Bin 0 -> 3215 bytes .../fields/__pycache__/simple.cpython-36.pyc | Bin 0 -> 3227 bytes .../site-packages/wtforms/fields/core.py | 1007 ++ .../site-packages/wtforms/fields/html5.py | 95 + .../site-packages/wtforms/fields/simple.py | 84 + .../python3.6/site-packages/wtforms/form.py | 310 + .../python3.6/site-packages/wtforms/i18n.py | 75 + .../site-packages/wtforms/locale/README.md | 22 + .../wtforms/locale/ar/LC_MESSAGES/wtforms.mo | Bin 0 -> 4530 bytes .../wtforms/locale/ar/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/bg/LC_MESSAGES/wtforms.mo | Bin 0 -> 4297 bytes .../wtforms/locale/bg/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/ca/LC_MESSAGES/wtforms.mo | Bin 0 -> 3425 bytes .../wtforms/locale/ca/LC_MESSAGES/wtforms.po | 179 + .../locale/cs_CZ/LC_MESSAGES/wtforms.mo | Bin 0 -> 3618 bytes .../locale/cs_CZ/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/cy/LC_MESSAGES/wtforms.mo | Bin 0 -> 3371 bytes .../wtforms/locale/cy/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/de/LC_MESSAGES/wtforms.mo | Bin 0 -> 3412 bytes .../wtforms/locale/de/LC_MESSAGES/wtforms.po | 181 + .../locale/de_CH/LC_MESSAGES/wtforms.mo | Bin 0 -> 3418 bytes .../locale/de_CH/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/el/LC_MESSAGES/wtforms.mo | Bin 0 -> 4307 bytes .../wtforms/locale/el/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/en/LC_MESSAGES/wtforms.mo | Bin 0 -> 3285 bytes .../wtforms/locale/en/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/es/LC_MESSAGES/wtforms.mo | Bin 0 -> 3394 bytes .../wtforms/locale/es/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/et/LC_MESSAGES/wtforms.mo | Bin 0 -> 3456 bytes .../wtforms/locale/et/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/fa/LC_MESSAGES/wtforms.mo | Bin 0 -> 4137 bytes .../wtforms/locale/fa/LC_MESSAGES/wtforms.po | 178 + .../wtforms/locale/fi/LC_MESSAGES/wtforms.mo | Bin 0 -> 3416 bytes .../wtforms/locale/fi/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/fr/LC_MESSAGES/wtforms.mo | Bin 0 -> 3484 bytes .../wtforms/locale/fr/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/he/LC_MESSAGES/wtforms.mo | Bin 0 -> 3649 bytes .../wtforms/locale/he/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/hu/LC_MESSAGES/wtforms.mo | Bin 0 -> 3544 bytes .../wtforms/locale/hu/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/it/LC_MESSAGES/wtforms.mo | Bin 0 -> 3510 bytes .../wtforms/locale/it/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/ja/LC_MESSAGES/wtforms.mo | Bin 0 -> 3736 bytes .../wtforms/locale/ja/LC_MESSAGES/wtforms.po | 177 + .../wtforms/locale/ko/LC_MESSAGES/wtforms.mo | Bin 0 -> 3851 bytes .../wtforms/locale/ko/LC_MESSAGES/wtforms.po | 177 + .../wtforms/locale/nb/LC_MESSAGES/wtforms.mo | Bin 0 -> 3337 bytes .../wtforms/locale/nb/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/nl/LC_MESSAGES/wtforms.mo | Bin 0 -> 3350 bytes .../wtforms/locale/nl/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/pl/LC_MESSAGES/wtforms.mo | Bin 0 -> 3610 bytes .../wtforms/locale/pl/LC_MESSAGES/wtforms.po | 182 + .../wtforms/locale/pt/LC_MESSAGES/wtforms.mo | Bin 0 -> 3438 bytes .../wtforms/locale/pt/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/ru/LC_MESSAGES/wtforms.mo | Bin 0 -> 4406 bytes .../wtforms/locale/ru/LC_MESSAGES/wtforms.po | 184 + .../wtforms/locale/sk/LC_MESSAGES/wtforms.mo | Bin 0 -> 3548 bytes .../wtforms/locale/sk/LC_MESSAGES/wtforms.po | 181 + .../wtforms/locale/sv/LC_MESSAGES/wtforms.mo | Bin 0 -> 3376 bytes .../wtforms/locale/sv/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/tr/LC_MESSAGES/wtforms.mo | Bin 0 -> 3391 bytes .../wtforms/locale/tr/LC_MESSAGES/wtforms.po | 179 + .../wtforms/locale/uk/LC_MESSAGES/wtforms.mo | Bin 0 -> 4451 bytes .../wtforms/locale/uk/LC_MESSAGES/wtforms.po | 182 + .../site-packages/wtforms/locale/wtforms.pot | 178 + .../wtforms/locale/zh/LC_MESSAGES/wtforms.mo | Bin 0 -> 3362 bytes .../wtforms/locale/zh/LC_MESSAGES/wtforms.po | 179 + .../locale/zh_TW/LC_MESSAGES/wtforms.mo | Bin 0 -> 3204 bytes .../locale/zh_TW/LC_MESSAGES/wtforms.po | 177 + .../python3.6/site-packages/wtforms/meta.py | 121 + .../python3.6/site-packages/wtforms/utils.py | 54 + .../site-packages/wtforms/validators.py | 582 ++ .../site-packages/wtforms/widgets/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 250 bytes .../widgets/__pycache__/core.cpython-36.pyc | Bin 0 -> 12480 bytes .../widgets/__pycache__/html5.cpython-36.pyc | Bin 0 -> 3906 bytes .../site-packages/wtforms/widgets/core.py | 348 + .../site-packages/wtforms/widgets/html5.py | 124 + venv/lib64 | 1 + venv/pyvenv.cfg | 3 + .../CacheControl-0.11.7-py2.py3-none-any.whl | Bin 0 -> 18720 bytes .../appdirs-1.4.3-py2.py3-none-any.whl | Bin 0 -> 12139 bytes .../certifi-2018.1.18-py2.py3-none-any.whl | Bin 0 -> 150807 bytes .../chardet-3.0.4-py2.py3-none-any.whl | Bin 0 -> 133328 bytes .../colorama-0.3.7-py2.py3-none-any.whl | Bin 0 -> 19915 bytes .../distlib-0.2.6-py2.py3-none-any.whl | Bin 0 -> 141707 bytes .../distro-1.0.1-py2.py3-none-any.whl | Bin 0 -> 11733 bytes .../html5lib-0.999999999-py2.py3-none-any.whl | Bin 0 -> 112620 bytes .../idna-2.6-py2.py3-none-any.whl | Bin 0 -> 56485 bytes .../ipaddress-0.0.0-py2.py3-none-any.whl | Bin 0 -> 17503 bytes .../lockfile-0.12.2-py2.py3-none-any.whl | Bin 0 -> 13506 bytes .../packaging-17.1-py2.py3-none-any.whl | Bin 0 -> 24058 bytes .../pip-9.0.1-py2.py3-none-any.whl | Bin 0 -> 159149 bytes .../pkg_resources-0.0.0-py2.py3-none-any.whl | Bin 0 -> 115663 bytes .../progress-1.2-py2.py3-none-any.whl | Bin 0 -> 9606 bytes .../pyparsing-2.2.0-py2.py3-none-any.whl | Bin 0 -> 56411 bytes .../requests-2.18.4-py2.py3-none-any.whl | Bin 0 -> 88576 bytes .../retrying-1.3.3-py2.py3-none-any.whl | Bin 0 -> 9480 bytes .../setuptools-39.0.1-py2.py3-none-any.whl | Bin 0 -> 455758 bytes .../six-1.11.0-py2.py3-none-any.whl | Bin 0 -> 10720 bytes .../urllib3-1.22-py2.py3-none-any.whl | Bin 0 -> 124700 bytes .../webencodings-0.5-py2.py3-none-any.whl | Bin 0 -> 11646 bytes .../wheel-0.30.0-py2.py3-none-any.whl | Bin 0 -> 48886 bytes 2619 files changed, 307852 insertions(+) create mode 100644 __pycache__/cat_or_not.cpython-36.pyc create mode 100644 __pycache__/cat_recognition.cpython-36.pyc create mode 100644 __pycache__/config.cpython-36.pyc create mode 100644 __pycache__/forms.cpython-36.pyc create mode 100644 __pycache__/hello.cpython-36.pyc create mode 100644 app/__init__.py create mode 100644 app/__pycache__/__init__.cpython-36.pyc create mode 100644 app/__pycache__/cat_recognition.cpython-36.pyc create mode 100644 app/__pycache__/forms.cpython-36.pyc create mode 100644 app/__pycache__/picture_downloader.cpython-36.pyc create mode 100644 app/__pycache__/routes.cpython-36.pyc create mode 100644 app/cat_recognition.py create mode 100644 app/forms.py create mode 100644 app/picture_downloader.py create mode 100644 app/routes.py create mode 100644 app/templates/base.html create mode 100644 app/templates/index.html create mode 100644 authentication.json create mode 100644 cat_or_not.py create mode 100644 config.py create mode 100644 pic.jpg create mode 100644 venv/bin/activate create mode 100644 venv/bin/activate.csh create mode 100644 venv/bin/activate.fish create mode 100755 venv/bin/chardetect create mode 100755 venv/bin/easy_install create mode 100755 venv/bin/easy_install-3.6 create mode 100755 venv/bin/flask create mode 100755 venv/bin/pip create mode 100755 venv/bin/pip3 create mode 100755 venv/bin/pip3.6 create mode 100755 venv/bin/pyrsa-decrypt create mode 100755 venv/bin/pyrsa-encrypt create mode 100755 venv/bin/pyrsa-keygen create mode 100755 venv/bin/pyrsa-priv2pub create mode 100755 venv/bin/pyrsa-sign create mode 100755 venv/bin/pyrsa-verify create mode 120000 venv/bin/python create mode 120000 venv/bin/python3 create mode 100644 venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/cachetools-3.0.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/cachetools/__init__.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/abc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/cache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/func.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/keys.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/lfu.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/lru.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/rr.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/__pycache__/ttl.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/cachetools/abc.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/cache.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/func.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/keys.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/lfu.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/lru.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/rr.py create mode 100644 venv/lib/python3.6/site-packages/cachetools/ttl.py create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/certifi/__init__.py create mode 100644 venv/lib/python3.6/site-packages/certifi/__main__.py create mode 100644 venv/lib/python3.6/site-packages/certifi/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/certifi/__pycache__/__main__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/certifi/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/certifi/cacert.pem create mode 100644 venv/lib/python3.6/site-packages/certifi/core.py create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/chardet/__init__.py create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/big5freq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/big5prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/chardistribution.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/charsetgroupprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/charsetprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/cp949prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/enums.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/escprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/escsm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/eucjpprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/euckrfreq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/euckrprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/euctwfreq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/euctwprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/gb2312freq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/gb2312prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/hebrewprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/jisfreq.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/jpcntx.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langhebrewmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langthaimodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/langturkishmodel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/latin1prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/mbcharsetprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/mbcssm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/sbcharsetprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/sjisprober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/universaldetector.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/utf8prober.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/big5freq.py create mode 100644 venv/lib/python3.6/site-packages/chardet/big5prober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/chardistribution.py create mode 100644 venv/lib/python3.6/site-packages/chardet/charsetgroupprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/charsetprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/cli/__init__.py create mode 100644 venv/lib/python3.6/site-packages/chardet/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/cli/__pycache__/chardetect.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/chardet/cli/chardetect.py create mode 100644 venv/lib/python3.6/site-packages/chardet/codingstatemachine.py create mode 100644 venv/lib/python3.6/site-packages/chardet/compat.py create mode 100644 venv/lib/python3.6/site-packages/chardet/cp949prober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/enums.py create mode 100644 venv/lib/python3.6/site-packages/chardet/escprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/escsm.py create mode 100644 venv/lib/python3.6/site-packages/chardet/eucjpprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/euckrfreq.py create mode 100644 venv/lib/python3.6/site-packages/chardet/euckrprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/euctwfreq.py create mode 100644 venv/lib/python3.6/site-packages/chardet/euctwprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/gb2312freq.py create mode 100644 venv/lib/python3.6/site-packages/chardet/gb2312prober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/hebrewprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/jisfreq.py create mode 100644 venv/lib/python3.6/site-packages/chardet/jpcntx.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langbulgarianmodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langcyrillicmodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langgreekmodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langhebrewmodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langhungarianmodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langthaimodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/langturkishmodel.py create mode 100644 venv/lib/python3.6/site-packages/chardet/latin1prober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/mbcharsetprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/mbcsgroupprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/mbcssm.py create mode 100644 venv/lib/python3.6/site-packages/chardet/sbcharsetprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/sbcsgroupprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/sjisprober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/universaldetector.py create mode 100644 venv/lib/python3.6/site-packages/chardet/utf8prober.py create mode 100644 venv/lib/python3.6/site-packages/chardet/version.py create mode 100644 venv/lib/python3.6/site-packages/click/__init__.py create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/_bashcomplete.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/_termui_impl.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/decorators.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/termui.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/types.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/click/_bashcomplete.py create mode 100644 venv/lib/python3.6/site-packages/click/_compat.py create mode 100644 venv/lib/python3.6/site-packages/click/_termui_impl.py create mode 100644 venv/lib/python3.6/site-packages/click/_textwrap.py create mode 100644 venv/lib/python3.6/site-packages/click/_unicodefun.py create mode 100644 venv/lib/python3.6/site-packages/click/_winconsole.py create mode 100644 venv/lib/python3.6/site-packages/click/core.py create mode 100644 venv/lib/python3.6/site-packages/click/decorators.py create mode 100644 venv/lib/python3.6/site-packages/click/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/click/formatting.py create mode 100644 venv/lib/python3.6/site-packages/click/globals.py create mode 100644 venv/lib/python3.6/site-packages/click/parser.py create mode 100644 venv/lib/python3.6/site-packages/click/termui.py create mode 100644 venv/lib/python3.6/site-packages/click/testing.py create mode 100644 venv/lib/python3.6/site-packages/click/types.py create mode 100644 venv/lib/python3.6/site-packages/click/utils.py create mode 100644 venv/lib/python3.6/site-packages/easy_install.py create mode 100644 venv/lib/python3.6/site-packages/flask/__init__.py create mode 100644 venv/lib/python3.6/site-packages/flask/__main__.py create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/__main__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/app.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/blueprints.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/cli.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/ctx.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/debughelpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/globals.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/logging.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/sessions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/signals.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/templating.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/testing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/views.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/__pycache__/wrappers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/_compat.py create mode 100644 venv/lib/python3.6/site-packages/flask/app.py create mode 100644 venv/lib/python3.6/site-packages/flask/blueprints.py create mode 100644 venv/lib/python3.6/site-packages/flask/cli.py create mode 100644 venv/lib/python3.6/site-packages/flask/config.py create mode 100644 venv/lib/python3.6/site-packages/flask/ctx.py create mode 100644 venv/lib/python3.6/site-packages/flask/debughelpers.py create mode 100644 venv/lib/python3.6/site-packages/flask/globals.py create mode 100644 venv/lib/python3.6/site-packages/flask/helpers.py create mode 100644 venv/lib/python3.6/site-packages/flask/json/__init__.py create mode 100644 venv/lib/python3.6/site-packages/flask/json/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/json/__pycache__/tag.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask/json/tag.py create mode 100644 venv/lib/python3.6/site-packages/flask/logging.py create mode 100644 venv/lib/python3.6/site-packages/flask/sessions.py create mode 100644 venv/lib/python3.6/site-packages/flask/signals.py create mode 100644 venv/lib/python3.6/site-packages/flask/templating.py create mode 100644 venv/lib/python3.6/site-packages/flask/testing.py create mode 100644 venv/lib/python3.6/site-packages/flask/views.py create mode 100644 venv/lib/python3.6/site-packages/flask/wrappers.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__init__.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/csrf.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/file.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/form.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/html5.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/__pycache__/i18n.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/_compat.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/csrf.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/file.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/form.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/html5.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/i18n.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/__init__.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/__pycache__/validators.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/__pycache__/widgets.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/fields.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/validators.py create mode 100644 venv/lib/python3.6/site-packages/flask_wtf/recaptcha/widgets.py create mode 100644 venv/lib/python3.6/site-packages/google/api/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/annotations_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/auth_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/backend_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/billing_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/config_change_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/consumer_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/context_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/control_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/distribution_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/documentation_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/endpoint_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/http_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/httpbody_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/label_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/log_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/logging_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/metric_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/monitored_resource_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/monitoring_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/quota_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/service_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/source_info_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/system_parameter_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/__pycache__/usage_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api/annotations_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/auth_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/backend_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/billing_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/config_change_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/consumer_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/context_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/control_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/distribution_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/documentation_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/endpoint_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/http_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/httpbody_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/label_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/log_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/logging_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/metric_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/monitored_resource_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/monitoring_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/quota_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/service_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/source_info_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/system_parameter_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api/usage_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/bidi.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/datetime_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/general_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/grpc_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/iam.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/operation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/page_iterator.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/path_template.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/protobuf_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/retry.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/__pycache__/timeout.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/bidi.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/datetime_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/polling.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/base.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/future/polling.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/client_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/method.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/routing_header.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/client_info.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/config.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/method.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/gapic_v1/routing_header.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/general_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/grpc_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/iam.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operation.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operations_v1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/operations_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/operations_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/page_iterator.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/path_template.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/protobuf_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/retry.py create mode 100644 venv/lib/python3.6/site-packages/google/api_core/timeout.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/_cloud_sdk.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/_default.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/_oauth2client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/_service_account_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/app_engine.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/credentials.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/environment_vars.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/iam.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/impersonated_credentials.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/__pycache__/jwt.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/_cloud_sdk.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/_default.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/_oauth2client.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/_service_account_info.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/app_engine.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/compute_engine/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/compute_engine/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/compute_engine/__pycache__/_metadata.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/compute_engine/__pycache__/credentials.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/compute_engine/_metadata.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/compute_engine/credentials.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/credentials.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__pycache__/_cryptography_rsa.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__pycache__/_helpers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__pycache__/_python_rsa.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/__pycache__/rsa.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/_cryptography_rsa.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/_helpers.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/_python_rsa.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/base.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/crypt/rsa.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/environment_vars.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/iam.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/impersonated_credentials.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/jwt.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/__pycache__/_http_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/__pycache__/grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/__pycache__/requests.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/__pycache__/urllib3.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/_http_client.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/requests.py create mode 100644 venv/lib/python3.6/site-packages/google/auth/transport/urllib3.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/__pycache__/vision.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_helpers/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_helpers/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_helpers/__pycache__/decorators.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_helpers/decorators.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/__pycache__/types.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__pycache__/enums.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__pycache__/image_annotator_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__pycache__/image_annotator_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__pycache__/product_search_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/__pycache__/product_search_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/enums.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/image_annotator_client.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/image_annotator_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/product_search_client.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/product_search_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/transports/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/transports/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/transports/__pycache__/image_annotator_grpc_transport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/transports/__pycache__/product_search_grpc_transport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/transports/image_annotator_grpc_transport.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/gapic/transports/product_search_grpc_transport.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/geometry_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/geometry_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/image_annotator_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/image_annotator_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/product_search_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/product_search_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/product_search_service_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/product_search_service_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/text_annotation_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/text_annotation_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/web_detection_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/__pycache__/web_detection_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/geometry_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/geometry_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/image_annotator_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/image_annotator_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/product_search_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/product_search_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/product_search_service_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/product_search_service_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/text_annotation_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/text_annotation_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/web_detection_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/proto/web_detection_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1/types.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/__pycache__/types.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/__pycache__/enums.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/__pycache__/image_annotator_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/__pycache__/image_annotator_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/enums.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/image_annotator_client.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/image_annotator_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/transports/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/transports/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/transports/__pycache__/image_annotator_grpc_transport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/gapic/transports/image_annotator_grpc_transport.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/geometry_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/geometry_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/image_annotator_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/image_annotator_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/text_annotation_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/text_annotation_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/web_detection_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/__pycache__/web_detection_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/geometry_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/geometry_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/image_annotator_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/image_annotator_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/text_annotation_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/text_annotation_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/web_detection_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/proto/web_detection_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p1beta1/types.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/__pycache__/types.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/__pycache__/enums.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/__pycache__/image_annotator_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/__pycache__/image_annotator_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/enums.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/image_annotator_client.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/image_annotator_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/transports/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/transports/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/transports/__pycache__/image_annotator_grpc_transport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/gapic/transports/image_annotator_grpc_transport.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/geometry_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/geometry_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/image_annotator_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/image_annotator_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/text_annotation_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/text_annotation_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/web_detection_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/__pycache__/web_detection_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/geometry_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/geometry_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/image_annotator_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/image_annotator_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/text_annotation_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/text_annotation_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/web_detection_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/proto/web_detection_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p2beta1/types.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/__pycache__/types.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__pycache__/enums.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__pycache__/image_annotator_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__pycache__/image_annotator_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__pycache__/product_search_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/__pycache__/product_search_client_config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/enums.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/image_annotator_client.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/image_annotator_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/product_search_client.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/product_search_client_config.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/transports/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/transports/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/transports/__pycache__/image_annotator_grpc_transport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/transports/__pycache__/product_search_grpc_transport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/transports/image_annotator_grpc_transport.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/gapic/transports/product_search_grpc_transport.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/geometry_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/geometry_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/image_annotator_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/image_annotator_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/product_search_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/product_search_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/product_search_service_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/product_search_service_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/text_annotation_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/text_annotation_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/web_detection_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/__pycache__/web_detection_pb2_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/geometry_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/geometry_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/image_annotator_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/image_annotator_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/product_search_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/product_search_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/product_search_service_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/product_search_service_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/text_annotation_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/text_annotation_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/web_detection_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/proto/web_detection_pb2_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/cloud/vision_v1p3beta1/types.py create mode 100644 venv/lib/python3.6/site-packages/google/logging/type/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/logging/type/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/logging/type/__pycache__/http_request_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/logging/type/__pycache__/log_severity_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/logging/type/http_request_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/logging/type/log_severity_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__pycache__/operations_grpc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__pycache__/operations_grpc_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__pycache__/operations_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__pycache__/operations_proto.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/__pycache__/operations_proto_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/operations_grpc.py create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/operations_grpc_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/operations_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/operations_proto.py create mode 100644 venv/lib/python3.6/site-packages/google/longrunning/operations_proto_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/__pycache__/_client.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/__pycache__/credentials.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/__pycache__/id_token.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/__pycache__/service_account.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/_client.py create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/credentials.py create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/id_token.py create mode 100644 venv/lib/python3.6/site-packages/google/oauth2/service_account.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/any_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/any_test_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/api_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/descriptor.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/descriptor_database.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/descriptor_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/descriptor_pool.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/duration_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/empty_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/field_mask_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/json_format.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/map_proto2_unittest_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/map_unittest_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/message.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/message_factory.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/proto_builder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/reflection.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/service.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/service_reflection.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/source_context_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/struct_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/symbol_database.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/test_messages_proto2_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/test_messages_proto3_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/text_encoding.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/text_format.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/timestamp_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/type_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_arena_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_custom_options_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_import_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_import_public_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_mset_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_mset_wire_format_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_no_arena_import_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_no_arena_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_no_generic_services_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/unittest_proto3_arena_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/__pycache__/wrappers_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/any_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/any_test_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/api_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/compiler/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/compiler/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/compiler/__pycache__/plugin_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/compiler/plugin_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/descriptor.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/descriptor_database.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/descriptor_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/descriptor_pool.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/duration_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/empty_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/field_mask_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/_parameterized.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/any_test_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/api_implementation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/containers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/decoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/descriptor_database_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/descriptor_pool_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/descriptor_pool_test1_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/descriptor_pool_test2_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/descriptor_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/encoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/enum_type_wrapper.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/factory_test1_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/factory_test2_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/file_options_test_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/generator_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/json_format_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/message_factory_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/message_listener.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/message_set_extensions_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/message_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/missing_enum_values_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/more_extensions_dynamic_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/more_extensions_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/more_messages_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/no_package_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/packed_field_test_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/proto_builder_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/python_message.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/reflection_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/service_reflection_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/symbol_database_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/test_bad_identifiers_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/test_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/testing_refleaks.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/text_encoding_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/text_format_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/type_checkers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/unknown_fields_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/well_known_types.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/well_known_types_test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/wire_format.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/__pycache__/wire_format_test.cpython-36.pyc create mode 100755 venv/lib/python3.6/site-packages/google/protobuf/internal/_api_implementation.cpython-36m-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/_parameterized.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/any_test_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/api_implementation.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/containers.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/decoder.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/descriptor_database_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/descriptor_pool_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/descriptor_pool_test1_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/descriptor_pool_test2_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/descriptor_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/encoder.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/enum_type_wrapper.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/factory_test1_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/factory_test2_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/file_options_test_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/generator_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/import_test_package/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/import_test_package/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/import_test_package/__pycache__/inner_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/import_test_package/__pycache__/outer_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/import_test_package/inner_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/import_test_package/outer_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/json_format_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/message_factory_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/message_listener.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/message_set_extensions_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/message_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/missing_enum_values_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/more_extensions_dynamic_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/more_extensions_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/more_messages_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/no_package_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/packed_field_test_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/proto_builder_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/python_message.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/reflection_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/service_reflection_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/symbol_database_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/test_bad_identifiers_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/test_util.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/testing_refleaks.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/text_encoding_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/text_format_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/type_checkers.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/unknown_fields_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/well_known_types.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/well_known_types_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/wire_format.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/internal/wire_format_test.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/json_format.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/map_proto2_unittest_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/map_unittest_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/message.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/message_factory.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/proto_builder.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/pyext/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/pyext/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/pyext/__pycache__/cpp_message.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/pyext/__pycache__/python_pb2.cpython-36.pyc create mode 100755 venv/lib/python3.6/site-packages/google/protobuf/pyext/_message.cpython-36m-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/pyext/cpp_message.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/pyext/python_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/reflection.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/service.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/service_reflection.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/source_context_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/struct_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/symbol_database.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/test_messages_proto2_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/test_messages_proto3_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/text_encoding.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/text_format.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/timestamp_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/type_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_arena_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_custom_options_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_import_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_import_public_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_mset_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_mset_wire_format_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_no_arena_import_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_no_arena_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_no_generic_services_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/unittest_proto3_arena_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/util/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/util/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/util/__pycache__/json_format_proto3_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/util/json_format_proto3_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/protobuf/wrappers_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/rpc/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/rpc/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/rpc/__pycache__/code_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/rpc/__pycache__/error_details_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/rpc/__pycache__/status_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/rpc/code_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/rpc/error_details_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/rpc/status_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/__init__.py create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/color_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/date_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/dayofweek_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/latlng_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/money_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/postal_address_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/__pycache__/timeofday_pb2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/google/type/color_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/date_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/dayofweek_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/latlng_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/money_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/postal_address_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google/type/timeofday_pb2.py create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0-py3.6-nspkg.pth create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/LICENSE create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/namespace_packages.txt create mode 100644 venv/lib/python3.6/site-packages/google_api_core-1.6.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1-py3.7-nspkg.pth create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1.dist-info/namespace_packages.txt create mode 100644 venv/lib/python3.6/site-packages/google_auth-1.6.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1-py3.6-nspkg.pth create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/LICENSE create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/namespace_packages.txt create mode 100644 venv/lib/python3.6/site-packages/google_cloud_vision-0.35.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5-nspkg.pth create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/namespace_packages.txt create mode 100644 venv/lib/python3.6/site-packages/googleapis_common_protos-1.5.5.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/grpc/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_auth.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_channel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_common.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_grpcio_metadata.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_interceptor.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_plugin_wrapping.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_server.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/__pycache__/_utilities.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/_auth.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_channel.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_common.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_cython/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_cython/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/_cython/_credentials/roots.pem create mode 100644 venv/lib/python3.6/site-packages/grpc/_cython/_cygrpc/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_cython/_cygrpc/__pycache__/__init__.cpython-36.pyc create mode 100755 venv/lib/python3.6/site-packages/grpc/_cython/cygrpc.cpython-36m-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.6/site-packages/grpc/_grpcio_metadata.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_interceptor.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_plugin_wrapping.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_server.py create mode 100644 venv/lib/python3.6/site-packages/grpc/_utilities.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/_client_adaptations.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/_metadata.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/_server_adaptations.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/implementations.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/interfaces.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/__pycache__/utilities.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/_client_adaptations.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/_metadata.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/_server_adaptations.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/implementations.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/interfaces.py create mode 100644 venv/lib/python3.6/site-packages/grpc/beta/utilities.py create mode 100644 venv/lib/python3.6/site-packages/grpc/experimental/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/experimental/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/experimental/__pycache__/gevent.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/experimental/__pycache__/session_cache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/experimental/gevent.py create mode 100644 venv/lib/python3.6/site-packages/grpc/experimental/session_cache.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/common/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/common/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/common/__pycache__/cardinality.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/common/__pycache__/style.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/common/cardinality.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/common/style.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/abandonment.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/callable_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/future.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/logging_pool.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/stream.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/__pycache__/stream_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/abandonment.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/callable_util.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/future.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/logging_pool.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/stream.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/foundation/stream_util.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/base/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/base/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/base/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/base/__pycache__/utilities.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/base/base.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/base/utilities.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/face/__init__.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/face/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/face/__pycache__/face.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/face/__pycache__/utilities.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/face/face.py create mode 100644 venv/lib/python3.6/site-packages/grpc/framework/interfaces/face/utilities.py create mode 100644 venv/lib/python3.6/site-packages/grpcio-1.17.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/grpcio-1.17.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/grpcio-1.17.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/grpcio-1.17.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/grpcio-1.17.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/idna-2.8.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/idna-2.8.dist-info/LICENSE.rst create mode 100644 venv/lib/python3.6/site-packages/idna-2.8.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/idna-2.8.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/idna-2.8.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/idna-2.8.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/idna/__init__.py create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/codec.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/idnadata.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/intranges.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/package_data.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/__pycache__/uts46data.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/idna/codec.py create mode 100644 venv/lib/python3.6/site-packages/idna/compat.py create mode 100644 venv/lib/python3.6/site-packages/idna/core.py create mode 100644 venv/lib/python3.6/site-packages/idna/idnadata.py create mode 100644 venv/lib/python3.6/site-packages/idna/intranges.py create mode 100644 venv/lib/python3.6/site-packages/idna/package_data.py create mode 100644 venv/lib/python3.6/site-packages/idna/uts46data.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/LICENSE.rst create mode 100644 venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/itsdangerous-1.1.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__init__.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/_json.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/encoding.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/exc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/jws.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/serializer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/signer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/timed.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/__pycache__/url_safe.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/_compat.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/_json.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/encoding.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/exc.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/jws.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/serializer.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/signer.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/timed.py create mode 100644 venv/lib/python3.6/site-packages/itsdangerous/url_safe.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/__init__.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/_identifier.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/asyncfilters.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/asyncsupport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/bccache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/compiler.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/constants.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/debug.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/defaults.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/environment.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/ext.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/filters.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/idtracking.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/lexer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/loaders.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/meta.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/nativetypes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/nodes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/optimizer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/parser.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/runtime.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/sandbox.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/tests.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/__pycache__/visitor.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/jinja2/_compat.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/_identifier.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/asyncfilters.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/asyncsupport.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/bccache.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/compiler.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/constants.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/debug.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/defaults.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/environment.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/ext.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/filters.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/idtracking.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/lexer.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/loaders.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/meta.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/nativetypes.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/nodes.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/optimizer.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/parser.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/runtime.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/sandbox.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/tests.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/utils.py create mode 100644 venv/lib/python3.6/site-packages/jinja2/visitor.py create mode 100644 venv/lib/python3.6/site-packages/markupsafe/__init__.py create mode 100644 venv/lib/python3.6/site-packages/markupsafe/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/markupsafe/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/markupsafe/__pycache__/_constants.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/markupsafe/__pycache__/_native.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/markupsafe/_compat.py create mode 100644 venv/lib/python3.6/site-packages/markupsafe/_constants.py create mode 100644 venv/lib/python3.6/site-packages/markupsafe/_native.py create mode 100644 venv/lib/python3.6/site-packages/markupsafe/_speedups.c create mode 100755 venv/lib/python3.6/site-packages/markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/pip-9.0.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/pip/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/__main__.py create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/basecommand.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/baseparser.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/locations.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/pep425tags.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/status_codes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/__pycache__/wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/basecommand.py create mode 100644 venv/lib/python3.6/site-packages/pip/baseparser.py create mode 100644 venv/lib/python3.6/site-packages/pip/cmdoptions.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/check.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/completion.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/download.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/freeze.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/hash.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/help.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/list.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/search.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/show.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/uninstall.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/__pycache__/wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/commands/check.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/completion.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/download.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/freeze.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/hash.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/help.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/install.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/list.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/search.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/show.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/uninstall.py create mode 100644 venv/lib/python3.6/site-packages/pip/commands/wheel.py create mode 100644 venv/lib/python3.6/site-packages/pip/compat/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/compat/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/compat/__pycache__/dictconfig.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/compat/dictconfig.py create mode 100644 venv/lib/python3.6/site-packages/pip/download.py create mode 100644 venv/lib/python3.6/site-packages/pip/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/pip/index.py create mode 100644 venv/lib/python3.6/site-packages/pip/locations.py create mode 100644 venv/lib/python3.6/site-packages/pip/models/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/models/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/models/__pycache__/index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/models/index.py create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__pycache__/check.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/operations/__pycache__/freeze.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/operations/check.py create mode 100644 venv/lib/python3.6/site-packages/pip/operations/freeze.py create mode 100644 venv/lib/python3.6/site-packages/pip/pep425tags.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_file.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_set.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/__pycache__/req_uninstall.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_file.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_install.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_set.py create mode 100644 venv/lib/python3.6/site-packages/pip/req/req_uninstall.py create mode 100644 venv/lib/python3.6/site-packages/pip/status_codes.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/appdirs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/build.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/deprecation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/encoding.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/filesystem.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/glibc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/hashes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/logging.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/outdated.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/packaging.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/setuptools_build.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/__pycache__/ui.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/utils/appdirs.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/build.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/deprecation.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/encoding.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/filesystem.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/glibc.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/hashes.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/logging.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/outdated.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/packaging.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/setuptools_build.py create mode 100644 venv/lib/python3.6/site-packages/pip/utils/ui.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/bazaar.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/git.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/mercurial.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/__pycache__/subversion.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/bazaar.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/git.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/mercurial.py create mode 100644 venv/lib/python3.6/site-packages/pip/vcs/subversion.py create mode 100644 venv/lib/python3.6/site-packages/pip/wheel.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/pkg_resources-0.0.0.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/_vendor/six.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/extern/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pkg_resources/py31compat.py create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1-py3.6-nspkg.pth create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1.dist-info/namespace_packages.txt create mode 100644 venv/lib/python3.6/site-packages/protobuf-3.6.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/pyasn1-0.4.4.dist-info/zip-safe create mode 100644 venv/lib/python3.6/site-packages/pyasn1/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/__pycache__/debug.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/__pycache__/error.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/__pycache__/decoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/__pycache__/encoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/__pycache__/eoo.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/decoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/encoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/ber/eoo.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/cer/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/cer/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/cer/__pycache__/decoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/cer/__pycache__/encoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/cer/decoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/cer/encoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/der/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/der/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/der/__pycache__/decoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/der/__pycache__/encoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/der/decoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/der/encoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/native/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/native/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/native/__pycache__/decoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/native/__pycache__/encoder.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/native/decoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/codec/native/encoder.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/binary.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/calling.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/dateandtime.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/integer.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/octets.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/__pycache__/string.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/binary.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/calling.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/dateandtime.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/integer.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/octets.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/compat/string.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/debug.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/error.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/base.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/char.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/constraint.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/error.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/namedtype.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/namedval.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/opentype.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/tag.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/tagmap.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/univ.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/__pycache__/useful.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/base.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/char.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/constraint.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/error.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/namedtype.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/namedval.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/opentype.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/tag.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/tagmap.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/univ.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1/type/useful.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules-0.2.2.dist-info/zip-safe create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/pem.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc1155.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc1157.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc1901.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc1902.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc1905.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2251.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2314.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2315.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2437.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2459.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2511.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2560.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc2986.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3279.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3280.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3281.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3412.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3414.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3447.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc3852.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc4210.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc4211.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc5208.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc5280.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc5652.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/__pycache__/rfc6402.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/pem.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc1155.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc1157.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc1901.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc1902.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc1905.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2251.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2314.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2315.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2437.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2459.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2511.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2560.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc2986.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3279.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3280.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3281.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3412.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3414.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3447.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc3852.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc4210.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc4211.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc5208.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc5280.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc5652.py create mode 100644 venv/lib/python3.6/site-packages/pyasn1_modules/rfc6402.py create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/pytz-2018.7.dist-info/zip-safe create mode 100644 venv/lib/python3.6/site-packages/pytz/__init__.py create mode 100644 venv/lib/python3.6/site-packages/pytz/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pytz/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pytz/__pycache__/lazy.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pytz/__pycache__/reference.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pytz/__pycache__/tzfile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pytz/__pycache__/tzinfo.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/pytz/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/pytz/lazy.py create mode 100644 venv/lib/python3.6/site-packages/pytz/reference.py create mode 100644 venv/lib/python3.6/site-packages/pytz/tzfile.py create mode 100644 venv/lib/python3.6/site-packages/pytz/tzinfo.py create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Adak create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Atka create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Belem create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Belize create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Boise create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Creston create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Denver create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Glace_Bay create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Godthab create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Havana create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Lima create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Managua create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Merida create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Mexico_City create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Miquelon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Montevideo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Montreal create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Montserrat create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Nassau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/New_York create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Nipigon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Nome create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Panama create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Recife create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Regina create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Sao_Paulo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Scoresbysund create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Thule create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Thunder_Bay create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Tijuana create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Toronto create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/America/Yellowknife create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Casey create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Troll create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Antarctica/Vostok create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Aden create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Almaty create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Famagusta create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Gaza create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Harbin create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Qatar create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Riyadh create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Saigon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/North create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/South create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/West create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/CET create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Central create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Eastern create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Cuba create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/EET create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/EST create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Egypt create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Eire create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/London create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Factory create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/GB create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/GMT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/GMT0 create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Greenwich create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/HST create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Hongkong create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Iceland create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Iran create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Israel create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Jamaica create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Japan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Libya create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/MET create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/MST create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/NZ create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Navajo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/PRC create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Poland create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Portugal create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/ROC create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/ROK create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Singapore create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Turkey create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/UCT create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Central create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/UTC create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Universal create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/W-SU create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/WET create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/Zulu create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/leapseconds create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/posixrules create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/zone.tab create mode 100644 venv/lib/python3.6/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 venv/lib/python3.6/site-packages/requests-2.21.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/requests-2.21.0.dist-info/LICENSE create mode 100644 venv/lib/python3.6/site-packages/requests-2.21.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/requests-2.21.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/requests-2.21.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/requests-2.21.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/requests/__init__.py create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/__version__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/_internal_utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/adapters.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/api.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/auth.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/certs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/cookies.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/help.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/hooks.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/models.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/packages.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/sessions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/status_codes.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/structures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/requests/__version__.py create mode 100644 venv/lib/python3.6/site-packages/requests/_internal_utils.py create mode 100644 venv/lib/python3.6/site-packages/requests/adapters.py create mode 100644 venv/lib/python3.6/site-packages/requests/api.py create mode 100644 venv/lib/python3.6/site-packages/requests/auth.py create mode 100644 venv/lib/python3.6/site-packages/requests/certs.py create mode 100644 venv/lib/python3.6/site-packages/requests/compat.py create mode 100644 venv/lib/python3.6/site-packages/requests/cookies.py create mode 100644 venv/lib/python3.6/site-packages/requests/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/requests/help.py create mode 100644 venv/lib/python3.6/site-packages/requests/hooks.py create mode 100644 venv/lib/python3.6/site-packages/requests/models.py create mode 100644 venv/lib/python3.6/site-packages/requests/packages.py create mode 100644 venv/lib/python3.6/site-packages/requests/sessions.py create mode 100644 venv/lib/python3.6/site-packages/requests/status_codes.py create mode 100644 venv/lib/python3.6/site-packages/requests/structures.py create mode 100644 venv/lib/python3.6/site-packages/requests/utils.py create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/rsa-4.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/rsa/__init__.py create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/asn1.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/cli.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/common.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/key.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/machine_size.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/parallel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/pem.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/pkcs1.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/pkcs1_v2.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/prime.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/randnum.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/transform.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/__pycache__/util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/rsa/_compat.py create mode 100644 venv/lib/python3.6/site-packages/rsa/asn1.py create mode 100644 venv/lib/python3.6/site-packages/rsa/cli.py create mode 100644 venv/lib/python3.6/site-packages/rsa/common.py create mode 100644 venv/lib/python3.6/site-packages/rsa/core.py create mode 100644 venv/lib/python3.6/site-packages/rsa/key.py create mode 100644 venv/lib/python3.6/site-packages/rsa/machine_size.py create mode 100644 venv/lib/python3.6/site-packages/rsa/parallel.py create mode 100644 venv/lib/python3.6/site-packages/rsa/pem.py create mode 100644 venv/lib/python3.6/site-packages/rsa/pkcs1.py create mode 100644 venv/lib/python3.6/site-packages/rsa/pkcs1_v2.py create mode 100644 venv/lib/python3.6/site-packages/rsa/prime.py create mode 100644 venv/lib/python3.6/site-packages/rsa/randnum.py create mode 100644 venv/lib/python3.6/site-packages/rsa/transform.py create mode 100644 venv/lib/python3.6/site-packages/rsa/util.py create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/dependency_links.txt create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/metadata.json create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/setuptools-39.0.1.dist-info/zip-safe create mode 100644 venv/lib/python3.6/site-packages/setuptools/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/glibc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/pep425tags.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/py36compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/_vendor/six.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/archive_util.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/build_meta.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/cli-32.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/cli-64.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/cli.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/alias.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/bdist_egg.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/build_clib.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/build_ext.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/build_py.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/develop.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/dist_info.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/easy_install.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/egg_info.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install_egg_info.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install_lib.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/install_scripts.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/py36compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/register.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/rotate.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/saveopts.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/sdist.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/setopt.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/test.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/upload.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/command/upload_docs.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/config.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/dep_util.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/depends.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/dist.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/extension.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/extern/__init__.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/setuptools/glibc.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/glob.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/gui-32.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/gui-64.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/gui.exe create mode 100644 venv/lib/python3.6/site-packages/setuptools/launch.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/lib2to3_ex.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/monkey.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/msvc.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/namespaces.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/package_index.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/pep425tags.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py27compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py31compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py33compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/py36compat.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/sandbox.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/script (dev).tmpl create mode 100644 venv/lib/python3.6/site-packages/setuptools/script.tmpl create mode 100644 venv/lib/python3.6/site-packages/setuptools/site-patch.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/ssl_support.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/unicode_utils.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/version.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/wheel.py create mode 100644 venv/lib/python3.6/site-packages/setuptools/windows_support.py create mode 100644 venv/lib/python3.6/site-packages/six-1.12.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/six-1.12.0.dist-info/LICENSE create mode 100644 venv/lib/python3.6/site-packages/six-1.12.0.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/six-1.12.0.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/six-1.12.0.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/six-1.12.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/six.py create mode 100644 venv/lib/python3.6/site-packages/urllib3-1.24.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.6/site-packages/urllib3-1.24.1.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.6/site-packages/urllib3-1.24.1.dist-info/METADATA create mode 100644 venv/lib/python3.6/site-packages/urllib3-1.24.1.dist-info/RECORD create mode 100644 venv/lib/python3.6/site-packages/urllib3-1.24.1.dist-info/WHEEL create mode 100644 venv/lib/python3.6/site-packages/urllib3-1.24.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.6/site-packages/urllib3/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/_collections.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/connection.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/connectionpool.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/filepost.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/poolmanager.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/request.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/__pycache__/response.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/_collections.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/connection.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/connectionpool.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/appengine.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/__pycache__/socks.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/appengine.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/securetransport.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/fields.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/filepost.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/__pycache__/six.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/backports/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/backports/makefile.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/six.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/poolmanager.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/request.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/response.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__init__.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/connection.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/queue.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/request.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/response.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/retry.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/ssl_.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/timeout.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/url.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/__pycache__/wait.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/connection.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/queue.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/request.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/response.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/retry.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/timeout.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/url.py create mode 100644 venv/lib/python3.6/site-packages/urllib3/util/wait.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__init__.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/_compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/_internal.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/_reloader.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/datastructures.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/exceptions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/filesystem.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/formparser.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/http.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/local.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/posixemulation.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/routing.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/script.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/security.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/serving.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/test.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/testapp.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/urls.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/useragents.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/websocket.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/wrappers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/__pycache__/wsgi.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/_compat.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/_internal.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/_reloader.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__init__.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/atom.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/cache.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/fixers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/limiter.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/lint.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/testtools.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/atom.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/cache.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/iterio.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/jsrouting.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/limiter.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/lint.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/profiler.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/securecookie.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/sessions.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/testtools.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/contrib/wrappers.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/datastructures.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/__init__.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/console.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/repr.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/console.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/repr.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/console.png create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/less.png create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/more.png create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/source.png create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/style.css create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 venv/lib/python3.6/site-packages/werkzeug/debug/tbtools.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/exceptions.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/filesystem.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/formparser.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/http.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/local.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/posixemulation.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/routing.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/script.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/security.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/serving.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/test.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/testapp.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/urls.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/useragents.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/utils.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/websocket.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/wrappers.py create mode 100644 venv/lib/python3.6/site-packages/werkzeug/wsgi.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/compat.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/form.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/i18n.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/meta.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/__pycache__/validators.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/compat.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/csrf/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/csrf/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/csrf/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/csrf/__pycache__/session.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/csrf/core.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/csrf/session.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/__pycache__/db.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/__pycache__/ndb.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/db.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/fields.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/appengine/ndb.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/__pycache__/form.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/__pycache__/session.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/fields.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/form.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/csrf/session.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/dateutil/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/dateutil/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/dateutil/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/dateutil/fields.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/__pycache__/i18n.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/__pycache__/orm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/fields.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/i18n.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/orm.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/templatetags/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/templatetags/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/templatetags/__pycache__/wtforms.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/django/templatetags/wtforms.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/i18n/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/i18n/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/i18n/__pycache__/form.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/i18n/__pycache__/utils.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/i18n/form.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/i18n/utils.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/sqlalchemy/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/sqlalchemy/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/sqlalchemy/__pycache__/fields.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/sqlalchemy/__pycache__/orm.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/sqlalchemy/fields.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/ext/sqlalchemy/orm.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/__pycache__/html5.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/__pycache__/simple.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/core.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/html5.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/fields/simple.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/form.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/i18n.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/README.md create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/wtforms.pot create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo create mode 100644 venv/lib/python3.6/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po create mode 100644 venv/lib/python3.6/site-packages/wtforms/meta.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/utils.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/validators.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/widgets/__init__.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/widgets/__pycache__/__init__.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/widgets/__pycache__/core.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/widgets/__pycache__/html5.cpython-36.pyc create mode 100644 venv/lib/python3.6/site-packages/wtforms/widgets/core.py create mode 100644 venv/lib/python3.6/site-packages/wtforms/widgets/html5.py create mode 120000 venv/lib64 create mode 100644 venv/pyvenv.cfg create mode 100644 venv/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/appdirs-1.4.3-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/certifi-2018.1.18-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/chardet-3.0.4-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/colorama-0.3.7-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/distlib-0.2.6-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/distro-1.0.1-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/html5lib-0.999999999-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/idna-2.6-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/packaging-17.1-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/pip-9.0.1-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/progress-1.2-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/requests-2.18.4-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/setuptools-39.0.1-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/six-1.11.0-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/urllib3-1.22-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/webencodings-0.5-py2.py3-none-any.whl create mode 100644 venv/share/python-wheels/wheel-0.30.0-py2.py3-none-any.whl diff --git a/__pycache__/cat_or_not.cpython-36.pyc b/__pycache__/cat_or_not.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87b4ec8effd550f3d1eaa6e25f7658f8773c24c2 GIT binary patch literal 146 zcmXr!<>h*Hl`lqwfq~&M5W@izkmUfx#R5Pgg&~D8has0Cih+?Kg(;Xplldi3ltGj6 z7IR`jfuAO05lHz;h9YJl1txx}>SyHVrs^jf804fD=_e6Z*kb< R=BJeAq}nk8bru6L0|1)IAQk`s literal 0 HcmV?d00001 diff --git a/__pycache__/cat_recognition.cpython-36.pyc b/__pycache__/cat_recognition.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f0382d7779cb6880d8012cb95c38b32cce3104c GIT binary patch literal 645 zcmYjO!HN_y5KSfBJ?+@LB6`uI2cbn~7QBim3xbz9xSoR0v`L)pG2I!G?7~9NY4^Gx z;t%*Sef8uoc(N)DGJ&dosmiOWSN-PXWI6ph{rZ_R_M06YytDUc;WawVG+5Sy1R%^U z?}ZeIh0gAn%yg~`{N{Rb!Rqo4GFS~$aovT^4T$o1vo}EjCGb#fvU9ZX0$pSyyM+Uc zpy3(Yf#yHBf3C#^(-|7Ws`S}xh8KaBl)OX`ar#?!fXH`Z#I4=Kfse4uMy@$xF^XM|YQ&}nU*LOMPS>|v zQx~3ABAYFQ*aHauV~X2d&;y Wqp5t`JAGx%J5m}*egzdT7ykgbuaJ@e literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-36.pyc b/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d1452d770a41b564e973b0ef30a03ba4674f292 GIT binary patch literal 363 zcmYLEu};G<6nwTr69vkIm{=Gygj8Zhs8SU%Aa$TDL`YVMO-SU}#Yu|FT7HKAVe-nv zFEC-JP@Z(>d-l7h^Z9rjb{~iL6##r%?8>uhYSErpV!)7q46cA-M&5uCjy5F23@sq? zzU&0d3&($jt(aO2ZVnk@kYP@0uij&5gO z_3=w3L@fD=>$vQB+s-531eD6W;gp(?(nhgfIDJ6rbDxXf7pz+2bGfRtl7^JL)5J!3 z2OZjDpzqVY?UEH{AVi R-Ku>z5L|4tU83Cv`~!n=R2%>R literal 0 HcmV?d00001 diff --git a/__pycache__/forms.cpython-36.pyc b/__pycache__/forms.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18070b22f818b9f7b2ebd625fe955411751992a1 GIT binary patch literal 567 zcmYjPyKWRQ6!o3=&dvrz1LYPp(_|yjB0wQpnkYi7ps*8@*#Xq z+G(ls3#quC0fHr8o%=q=^0URF{BU#d@i8#=i~V;J!msH16EesUG&8^f0*-WKVji1> zCnn{o$#^!#W1X9V7r@>yOfdb}uKLC)+=kJA&p+x(@A?}@aSwNW|Mf_y$AY_BNTdqD^qgLCa zBdy$OD?4GGphc@4vGIqOUtK|EDP13=74Q(o$XQ+T*)F`LxbAi?q8!f&g|2CND0iW8 mT+Sc;Ngmz{8~KgX?g>rk0ksXq^GVwa`X0;&1rf{m%*()glR2GC#^Uqv_6q>M34f6hyCC$JR1_#QV6j0=oDpXY8+c|in>RUv zM$LEF6uP)CRlY;TRq+Ni5vsg~O8k%yR2cc(wEY8-Bd<3~dl|ItOdB+f#y6dDt(rS; z_gF8JA_Wq1!WE%ErV?NWuMkk-3;pJuk$<*$9^aAQ<8&RYA+LNzE*0}h=+iY7`hwaA z_>$WGq+UC#>*Z`_w6B+Kkj~4E3-wwX&Br7Jw6=V0FO uw5}hvMIq&;wOY!UwOtpvciW%`>9G1=5u}ge%sRC-`aIp)r_lkX6zmtSEn0H` literal 0 HcmV?d00001 diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..f5b34f4 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,7 @@ +from flask import Flask +from config import Config + +app = Flask(__name__) +app.config.from_object(Config) + +from app import routes diff --git a/app/__pycache__/__init__.cpython-36.pyc b/app/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10c727a7ea85a39c47598816c7326638c2c9b734 GIT binary patch literal 275 zcmX|4u};G<5VhktwMxrxpe(pj*9svaF|x2lNT)QpKvFx79Cu(t>Id*0{1AgzCVqj5 zbCEddy?dv7?{2$ZFW)~epWYZ_Uxfe4NZk_V9Z}0#ZkXj2=SgQKv!W85A;2EBWv%!lr zD1foH2oOa*P4S}h&Vt(y*aV-G;e+`lwKM%(=@(~FH=B(?ubVo6^Dw%gDXIbbu@3;( W(`!^a>)NBi8&26-5v}+tQ-oh=O+%Xi literal 0 HcmV?d00001 diff --git a/app/__pycache__/cat_recognition.cpython-36.pyc b/app/__pycache__/cat_recognition.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..279ca63e97b7f370e541dd38b51bf31fc571f4d1 GIT binary patch literal 706 zcmYjP&5G1O5bmF(C(LGM5xw{b0m&?S6A@)W*vnkjQxHN-x3h_zbm;CC7P6=D>Vxbn z_0^L%y?U~$Bg=HCO8s=#s!f(G%ebDbH%O8woWTuU(l2eDBuLELLl9`KKV?deR8 z^qxNYWRCHfO7@)eO!BYHzLd!|ktqm)Zem|?rHw`Gz}v=u{7~?aPPQ9;SbtHzy{Tp6 zn{Xy!0^3amL3 zFm?!2PIp0cu7+DFQrUtcH2eQ;X~Jv{kw@MMI2ShFiaI3V!ps^!|MD8ZDKWyi?x>idTpJllX1D}UE5u) zTcvSay_VkJT8DF5om;Dw?B;B_8Qz<=pAyD6mG-nzxI#%2~`y1fQ&~f zMo`ItT>(a4Bc7@Z;{)&<6QY)m<=efs5(6ooylT7a8hH6p>K0{ho&UUiA^T(Njyu~w zyR3_`5TcVt2{D#J7>k1rxDw)Kkb3U8n67s@g)ttSc3D7~pG16P?kIFa_;u2Jutqi8 zvooz+vz5KDPS8b--0zzmG4iMTPp+V&DY*~w3b+qb<+3jMVi(?1-1a*cQIF?@!qiM4 q9Cu-GBETQ~X`bGRn>bF}?nuq(9*vE~lUd(W`XbB+6%{;!D*6pIwT!O- literal 0 HcmV?d00001 diff --git a/app/__pycache__/picture_downloader.cpython-36.pyc b/app/__pycache__/picture_downloader.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fd1e52a9214426a7c447f0725d39de2b8c01326 GIT binary patch literal 405 zcmYjNu};H447D$56IE(K6+e-sDPlzk!QO?fLWOS6yJ+rVh#WR literal 0 HcmV?d00001 diff --git a/app/__pycache__/routes.cpython-36.pyc b/app/__pycache__/routes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32d58837e2fec07c2d694890d16b4ffa35974bae GIT binary patch literal 690 zcmYjOyN=W_6tx{Y$z*2&8u$SUicm~eqC*I+v|{N7q*)pZDGIS?Cc%y)$KkQstwOsW z!bk8UX{l%_x8gbltRo*E-|PE0H_unA2Iio zGCZ*hRra5NJg~AA(iTqYPL)oADS6*1Q;G{?HQa)->-@W_bcL0bIkdH_O$(-VS66PZ zvJmD=>m#JS!}%1vd3`z2cW-x>@FvpI9gXNKU)L{~0`khwVfQZp92(ILx<(Bik=;1b z1i)#-Mtp-^*hJTO#P*rMJDAE2xmbW-&|Bac+g{Q0(mlDNTLYNXpycc3=(K{$bnp9L zSYM2jfYlg|BtMn*j$t^Aj`(f>StA!c~9u!p@+!B3SeS$sX5Wy*FAXT V{qaj}#GvFW47c7ZS>k^m`3qlQs>}cY literal 0 HcmV?d00001 diff --git a/app/cat_recognition.py b/app/cat_recognition.py new file mode 100644 index 0000000..b65d418 --- /dev/null +++ b/app/cat_recognition.py @@ -0,0 +1,20 @@ +# Imports the Google Cloud client library +from google.cloud import vision +from google.cloud.vision import types + +def is_cat(content): + labels = fetch_data(content) + if labels[0].description == "cat": + return True + else: + return False + +def fetch_data(content): + # Instantiates a client + client = vision.ImageAnnotatorClient() + # Tell Google Vision that our content is of type Image + image = types.Image(content=content) + # Performs label detection on the image file + response = client.label_detection(image=image) + # Return array of labels + return response.label_annotations diff --git a/app/forms.py b/app/forms.py new file mode 100644 index 0000000..ab65d4c --- /dev/null +++ b/app/forms.py @@ -0,0 +1,7 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, BooleanField, SubmitField +from wtforms.validators import DataRequired + +class UploadForm(FlaskForm): + url = StringField('Link', validators=[DataRequired()]) + submit = SubmitField('Cat or not?') diff --git a/app/picture_downloader.py b/app/picture_downloader.py new file mode 100644 index 0000000..3304f35 --- /dev/null +++ b/app/picture_downloader.py @@ -0,0 +1,10 @@ +import requests + +def get_image_from_url(url): + f = open('pic.jpg','wb') + f.write(requests.get(url).content) + f.close() + f = open('pic.jpg','rb') + file = f.read() + f.close() + return file diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 0000000..feedcbd --- /dev/null +++ b/app/routes.py @@ -0,0 +1,18 @@ +from flask import Flask +from flask import render_template +from app.forms import UploadForm +from app import app +from app import cat_recognition as cat +from app import picture_downloader as downloader + +@app.route('/', methods=['GET', 'POST']) +def index(): + form = UploadForm() + if form.validate_on_submit(): + content = downloader.get_image_from_url(form.url.data) + if cat.is_cat(content): + return "Cat!" + else: + return "Not!" + + return render_template('index.html', form=form) diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..519c49c --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,23 @@ + + + + {% if title %} + {{ title }} | Cat or Not + {% else %} + Cat or Not + {% endif %} + + + + {% with messages = get_flashed_messages() %} + {% if messages %} +
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+ {% endif %} + {% endwith %} + {% block content %}{% endblock %} + + diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..18c65da --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block content %} +

Check if the picture is cat or not!

+
+ {{ form.hidden_tag() }} +

+ {{ form.url.label }}
+ {{ form.url }} +

+

{{ form.submit() }}

+
+{% endblock %} diff --git a/authentication.json b/authentication.json new file mode 100644 index 0000000..c2beba1 --- /dev/null +++ b/authentication.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "quiet-odyssey-225116", + "private_key_id": "f2553a958e511debcf46d10957e3c7fbdb906aa1", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfmChqO8VSfmEi\nSNeGhgq3jCe5iCk67yoaatQ9kYd10pmVST6OjJ3nmxd1iYAAYCB59wV4V19C67oj\n5x0bxhhKITilS94bNhZJFB4FjwMIGrDXe9SGcZwSwrB+ggFhvZGNQjYWDe7rrJ/V\nXemA8kO/wfVYUgHsjWXm3VKEeP4G0j8mndA+PP2T/aJNIWok5IA/emqr305YNMvd\n+C8TB6htf4Pqe1ZDHNyrGzYKUy1KbMAdtBXgmpVCKeo4XdlV1s0y7tVnCN+4MUM5\nVAP1fD9985fh84Zw+nMt6//pxGORwnvTNDjPjPwqEwQbV02YcfYMKPjXWSDFxv+v\nOqDUwAsjAgMBAAECggEAaQNRl/NSjZgFjtCfSPMTfXk5/w1QL/m70IR0AiajdFbh\nAxhPZSvtzaUts2pMz+BV4HKAAzEl8Iw99DbLmQvExKwtqpSjUCxq8w+bugic5+WB\nQPNLsYkSQE1oD0KH25vpDGsYc+s/VzjQKKnezUz7PMifrkd119/hCDjSVJ1u0Ux0\nit7ZsoLFzWWorC1CVUPHMqUtlgF8L85w4Yfma7X64yoPNvomI4MFV8E9UfUoZBY0\n02x8mBNX9fjIHzNXkyF6OD8O1IMkrADaJbdmcfgMwBWtarIEsNIiUQsFnFeaN69b\nf26NTQQux9jgMJnMu9V1TNdG6K6TshIw8a/uB4lmYQKBgQD8AUg0Qu9tS8Y4AQfq\nd/0frLIitmnzVs0Lt3TFIw1OjUrfki5gStAEVGhIN2SXLF6lWjqrtk43xQFjzuKr\nL9kuN76MbYDnITuew+9VJPnmA2EiTspcVPNph44FqPSNOar9GCCY7QB6ue+fm5bq\nFyPaHfoKuRmwbvHqVgI2L2HJbQKBgQDjI5OEWYxfJLC6StpEmmOY8W19ZQPTXBKt\nfLSEsDuAjrC2kT6ladXezYuYy/VSAbjdCYbJ1yDABNILDZky0ZSD2midtnqe3z0v\nTKBudkxEDYgRKvgQxMY89N6JpSOedY3v63cOvRwPbVi4sF+REbRu4e+OVsIlpXaK\n/IcINZdczwKBgQCNl87RBnbuqy+xkeq3tDl2DZt9Y47+WdwV5Dto9LvqUfsqyUDj\ne8WLWT3Krc0IH7cCI0Np7aHfNgME6F51nwnhLRMUZgaSVxrfpumXppH+yhFOrISJ\nAnZN6gtDZN4bZ7aKRH80TZ4CVuyrekl+OAg96q/uTHiBqKSmbTMK7O59tQKBgCMD\n3f7eKySTrGbbmTBQOKBgP4fAJcnUfNCf09hMrq+Pz7AlTeoEGcNCHo4MiyH8P/pb\nOJsu/c58L8EidIaABowZBF2jvt10/qKnBmhg9jrbdylmXV2AaCsHeLLxcT9BUgM1\nYmI0Rvod2jqGfgUIHK+nRt3DhCR3kIG2kj5yvIXDAoGAVNd8sw08+U4JMg0TPK71\nhWNeXyNc9aLpehqdIVQPs6KdhlVcoFHKLCDASzMUxNtU27b3Nqgh5dBS4YbNKXoa\n5UZUvxa2Khw1/rT9wTcaIap0kfh1SOZseSfpNUy5mrSKnnVkIn1NKmI0a+mN0gcT\nD706pAo2V7oFEQFocuua1yY=\n-----END PRIVATE KEY-----\n", + "client_email": "c00lerxo@quiet-odyssey-225116.iam.gserviceaccount.com", + "client_id": "106421721962581253770", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/c00lerxo%40quiet-odyssey-225116.iam.gserviceaccount.com" +} diff --git a/cat_or_not.py b/cat_or_not.py new file mode 100644 index 0000000..d099b92 --- /dev/null +++ b/cat_or_not.py @@ -0,0 +1 @@ +from app import app diff --git a/config.py b/config.py new file mode 100644 index 0000000..5bf854f --- /dev/null +++ b/config.py @@ -0,0 +1,4 @@ +import os + +class Config(object): + SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess' diff --git a/pic.jpg b/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da24e28b56f8b0af28c88f8cc03ceafe36a32135 GIT binary patch literal 6741 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 GUj85N+. +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/c00ler/cat_or_not/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if ("venv" != "") then + set env_name = "venv" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish new file mode 100644 index 0000000..c072b55 --- /dev/null +++ b/venv/bin/activate.fish @@ -0,0 +1,75 @@ +# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) +# you cannot run it directly + +function deactivate -d "Exit virtualenv and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + if test "$argv[1]" != "nondestructive" + # Self destruct! + functions -e deactivate + end +end + +# unset irrelevant variables +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/c00ler/cat_or_not/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# unset PYTHONHOME if set +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # save the current fish_prompt function as the function _old_fish_prompt + functions -c fish_prompt _old_fish_prompt + + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command + set -l old_status $status + + # Prompt override? + if test -n "(venv) " + printf "%s%s" "(venv) " (set_color normal) + else + # ...Otherwise, prepend env + set -l _checkbase (basename "$VIRTUAL_ENV") + if test $_checkbase = "__" + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) + else + printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) + end + end + + # Restore the return status of the previous command. + echo "exit $old_status" | . + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/venv/bin/chardetect b/venv/bin/chardetect new file mode 100755 index 0000000..4616470 --- /dev/null +++ b/venv/bin/chardetect @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from chardet.cli.chardetect import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/easy_install b/venv/bin/easy_install new file mode 100755 index 0000000..96f35b9 --- /dev/null +++ b/venv/bin/easy_install @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- 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/venv/bin/easy_install-3.6 b/venv/bin/easy_install-3.6 new file mode 100755 index 0000000..96f35b9 --- /dev/null +++ b/venv/bin/easy_install-3.6 @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- 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/venv/bin/flask b/venv/bin/flask new file mode 100755 index 0000000..75c643d --- /dev/null +++ b/venv/bin/flask @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from flask.cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip b/venv/bin/pip new file mode 100755 index 0000000..1d7ab5e --- /dev/null +++ b/venv/bin/pip @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 new file mode 100755 index 0000000..1d7ab5e --- /dev/null +++ b/venv/bin/pip3 @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3.6 b/venv/bin/pip3.6 new file mode 100755 index 0000000..1d7ab5e --- /dev/null +++ b/venv/bin/pip3.6 @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pyrsa-decrypt b/venv/bin/pyrsa-decrypt new file mode 100755 index 0000000..3874a61 --- /dev/null +++ b/venv/bin/pyrsa-decrypt @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from rsa.cli import decrypt + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(decrypt()) diff --git a/venv/bin/pyrsa-encrypt b/venv/bin/pyrsa-encrypt new file mode 100755 index 0000000..7040382 --- /dev/null +++ b/venv/bin/pyrsa-encrypt @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from rsa.cli import encrypt + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(encrypt()) diff --git a/venv/bin/pyrsa-keygen b/venv/bin/pyrsa-keygen new file mode 100755 index 0000000..d47dc27 --- /dev/null +++ b/venv/bin/pyrsa-keygen @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from rsa.cli import keygen + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(keygen()) diff --git a/venv/bin/pyrsa-priv2pub b/venv/bin/pyrsa-priv2pub new file mode 100755 index 0000000..ec75a7e --- /dev/null +++ b/venv/bin/pyrsa-priv2pub @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from rsa.util import private_to_public + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(private_to_public()) diff --git a/venv/bin/pyrsa-sign b/venv/bin/pyrsa-sign new file mode 100755 index 0000000..d3aedcd --- /dev/null +++ b/venv/bin/pyrsa-sign @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from rsa.cli import sign + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(sign()) diff --git a/venv/bin/pyrsa-verify b/venv/bin/pyrsa-verify new file mode 100755 index 0000000..4e9be65 --- /dev/null +++ b/venv/bin/pyrsa-verify @@ -0,0 +1,11 @@ +#!/home/c00ler/cat_or_not/venv/bin/python3 + +# -*- coding: utf-8 -*- +import re +import sys + +from rsa.cli import verify + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(verify()) diff --git a/venv/bin/python b/venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..87ce152 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/LICENSE.txt @@ -0,0 +1,39 @@ +Copyright © 2014 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +- Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +---- + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright © 2001-2006 Gregory P. Ward. All rights reserved. +Copyright © 2002-2006 Python Software Foundation. All rights reserved. diff --git a/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA new file mode 100644 index 0000000..625bdad --- /dev/null +++ b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/METADATA @@ -0,0 +1,121 @@ +Metadata-Version: 2.1 +Name: Click +Version: 7.0 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/click +Project-URL: Issue tracker, https://github.com/pallets/click/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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.* + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install click + +Click supports Python 3.4 and newer, Python 2.7, and PyPy. + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +A Simple Example +---------------- + +What does it look like? Here is an example of a simple Click program: + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", + help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo("Hello, %s!" % name) + + if __name__ == '__main__': + hello() + +And what it looks like when run: + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/click/ +* Documentation: https://click.palletsprojects.com/ +* License: `BSD `_ +* Releases: https://pypi.org/project/click/ +* Code: https://github.com/pallets/click +* Issue tracker: https://github.com/pallets/click/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/click + * Windows: https://ci.appveyor.com/project/pallets/click + +* Test coverage: https://codecov.io/gh/pallets/click + + diff --git a/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD new file mode 100644 index 0000000..41d00e2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/RECORD @@ -0,0 +1,40 @@ +Click-7.0.dist-info/LICENSE.txt,sha256=4hIxn676T0Wcisk3_chVcECjyrivKTZsoqSNI5AlIlw,1876 +Click-7.0.dist-info/METADATA,sha256=-r8jeke3Zer4diRvT1MjFZuiJ6yTT_qFP39svLqdaLI,3516 +Click-7.0.dist-info/RECORD,, +Click-7.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +Click-7.0.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=HjGThQ7tef9kkwCV371TBnrf0SAi6fKfU_jtEnbYTvQ,2789 +click/_bashcomplete.py,sha256=iaNUmtxag0YPfxba3TDYCNietiTMQIrvhRLj-H8okFU,11014 +click/_compat.py,sha256=vYmvoj4opPxo-c-2GMQQjYT_r_QkOKybkfGoeVrt0dA,23399 +click/_termui_impl.py,sha256=xHmLtOJhKUCVD6168yucJ9fknUJPAMs0eUTPgVUO-GQ,19611 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=QHy2_5jYlX-36O-JVrTHNnHOqg8tquUR0HmQFev7Ics,4364 +click/_winconsole.py,sha256=PPWVak8Iikm_gAPsxMrzwsVFCvHgaW3jPaDWZ1JBl3U,8965 +click/core.py,sha256=q8FLcDZsagBGSRe5Y9Hi_FGvAeZvusNfoO5EkhkSQ8Y,75305 +click/decorators.py,sha256=idKt6duLUUfAFftrHoREi8MJSd39XW36pUVHthdglwk,11226 +click/exceptions.py,sha256=CNpAjBAE7qjaV4WChxQeak95e5yUOau8AsvT-8m6wss,7663 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=oQkou3ZQ5DgrbVM6BwIBirwiqozbjfirzsLGAlLRRdg,1514 +click/parser.py,sha256=m-nGZz4VwprM42_qtFlWFGo7yRJQxkBlRcZodoH593Y,15510 +click/termui.py,sha256=o_ZXB2jyvL2Rce7P_bFGq452iyBq9ykJyRApIPMCZO0,23207 +click/testing.py,sha256=aYGqY_iWLu2p4k7lkuJ6t3fqpf6aPGqTsyLzNY_ngKg,13062 +click/types.py,sha256=2Q929p-aBP_ZYuMFJqJR-Ipucofv3fmDc5JzBDPmzJU,23287 +click/utils.py,sha256=6-D0WkAxvv9FkgHXSHwDIv0l9Gdx9Mm6Z5vuKNLIfZI,15763 +Click-7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click/__pycache__/testing.cpython-36.pyc,, +click/__pycache__/_termui_impl.cpython-36.pyc,, +click/__pycache__/parser.cpython-36.pyc,, +click/__pycache__/_bashcomplete.cpython-36.pyc,, +click/__pycache__/_winconsole.cpython-36.pyc,, +click/__pycache__/_compat.cpython-36.pyc,, +click/__pycache__/types.cpython-36.pyc,, +click/__pycache__/termui.cpython-36.pyc,, +click/__pycache__/__init__.cpython-36.pyc,, +click/__pycache__/exceptions.cpython-36.pyc,, +click/__pycache__/globals.cpython-36.pyc,, +click/__pycache__/utils.cpython-36.pyc,, +click/__pycache__/core.cpython-36.pyc,, +click/__pycache__/_unicodefun.cpython-36.pyc,, +click/__pycache__/decorators.cpython-36.pyc,, +click/__pycache__/formatting.cpython-36.pyc,, +click/__pycache__/_textwrap.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL new file mode 100644 index 0000000..1316c41 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Click-7.0.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..8f9252f --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright © 2010 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA new file mode 100644 index 0000000..c600e73 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/METADATA @@ -0,0 +1,130 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 1.0.2 +Summary: A simple framework for building complex web applications. +Home-page: https://www.palletsprojects.com/p/flask/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, http://flask.pocoo.org/docs/ +Project-URL: Code, https://github.com/pallets/flask +Project-URL: Issue tracker, https://github.com/pallets/flask/issues +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: dev +Provides-Extra: docs +Provides-Extra: dotenv +Requires-Dist: Werkzeug (>=0.14) +Requires-Dist: Jinja2 (>=2.10) +Requires-Dist: itsdangerous (>=0.24) +Requires-Dist: click (>=5.1) +Provides-Extra: dev +Requires-Dist: pytest (>=3); extra == 'dev' +Requires-Dist: coverage; extra == 'dev' +Requires-Dist: tox; extra == 'dev' +Requires-Dist: sphinx; extra == 'dev' +Requires-Dist: pallets-sphinx-themes; extra == 'dev' +Requires-Dist: sphinxcontrib-log-cabinet; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: pallets-sphinx-themes; extra == 'docs' +Requires-Dist: sphinxcontrib-log-cabinet; extra == 'docs' +Provides-Extra: dotenv +Requires-Dist: python-dotenv; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Flask + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + + app = Flask(__name__) + + @app.route('/') + def hello(): + return 'Hello, World!' + +.. code-block:: text + + $ FLASK_APP=hello.py flask run + * Serving Flask app "hello" + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20 + + +Links +----- + +* Website: https://www.palletsprojects.com/p/flask/ +* Documentation: http://flask.pocoo.org/docs/ +* License: `BSD `_ +* Releases: https://pypi.org/project/Flask/ +* Code: https://github.com/pallets/flask +* Issue tracker: https://github.com/pallets/flask/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/flask + * Windows: https://ci.appveyor.com/project/pallets/flask + +* Test coverage: https://codecov.io/gh/pallets/flask + +.. _WSGI: https://wsgi.readthedocs.io +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD new file mode 100644 index 0000000..bb79ce8 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/RECORD @@ -0,0 +1,48 @@ +Flask-1.0.2.dist-info/LICENSE.txt,sha256=ziEXA3AIuaiUn1qe4cd1XxCESWTYrk4TjN7Qb06J3l8,1575 +Flask-1.0.2.dist-info/METADATA,sha256=iA5tiNWzTtgCVe80aTZGNWsckj853fJyfvHs9U-WZRk,4182 +Flask-1.0.2.dist-info/RECORD,, +Flask-1.0.2.dist-info/WHEEL,sha256=J3CsTk7Mf2JNUyhImI-mjX-fmI4oDjyiXgWT4qgZiCE,110 +Flask-1.0.2.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-1.0.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=qq8lK6QQbxJALf1igz7qsvUwOTAoKvFGfdLm7jPNsso,1673 +flask/__main__.py,sha256=pgIXrHhxM5MAMvgzAqWpw_t6AXZ1zG38us4JRgJKtxk,291 +flask/_compat.py,sha256=UDFGhosh6mOdNB-4evKPuneHum1OpcAlwTNJCRm0irQ,2892 +flask/app.py,sha256=ahpe3T8w98rQd_Er5d7uDxK57S1nnqGQx3V3hirBovU,94147 +flask/blueprints.py,sha256=Cyhl_x99tgwqEZPtNDJUFneAfVJxWfEU4bQA7zWS6VU,18331 +flask/cli.py,sha256=30QYAO10Do9LbZYCLgfI_xhKjASdLopL8wKKVUGS2oA,29442 +flask/config.py,sha256=kznUhj4DLYxsTF_4kfDG8GEHto1oZG_kqblyrLFtpqQ,9951 +flask/ctx.py,sha256=leFzS9fzmo0uaLCdxpHc5_iiJZ1H0X_Ig4yPCOvT--g,16224 +flask/debughelpers.py,sha256=1ceC-UyqZTd4KsJkf0OObHPsVt5R3T6vnmYhiWBjV-w,6479 +flask/globals.py,sha256=pGg72QW_-4xUfsI33I5L_y76c21AeqfSqXDcbd8wvXU,1649 +flask/helpers.py,sha256=YCl8D1plTO1evEYP4KIgaY3H8Izww5j4EdgRJ89oHTw,40106 +flask/logging.py,sha256=qV9h0vt7NIRkKM9OHDWndzO61E5CeBMlqPJyTt-W2Wc,2231 +flask/sessions.py,sha256=2XHV4ASREhSEZ8bsPQW6pNVNuFtbR-04BzfKg0AfvHo,14452 +flask/signals.py,sha256=BGQbVyCYXnzKK2DVCzppKFyWN1qmrtW1QMAYUs-1Nr8,2211 +flask/templating.py,sha256=FDfWMbpgpC3qObW8GGXRAVrkHFF8K4CHOJymB1wvULI,4914 +flask/testing.py,sha256=XD3gWNvLUV8dqVHwKd9tZzsj81fSHtjOphQ1wTNtlMs,9379 +flask/views.py,sha256=Wy-_WkUVtCfE2zCXYeJehNgHuEtviE4v3HYfJ--MpbY,5733 +flask/wrappers.py,sha256=1Z9hF5-hXQajn_58XITQFRY8efv3Vy3uZ0avBfZu6XI,7511 +flask/json/__init__.py,sha256=Ns1Hj805XIxuBMh2z0dYnMVfb_KUgLzDmP3WoUYaPhw,10729 +flask/json/tag.py,sha256=9ehzrmt5k7hxf7ZEK0NOs3swvQyU9fWNe-pnYe69N60,8223 +../../../bin/flask,sha256=1RmXXcG_g9i701ODWEGGhFA3KfN8lLFwp4CMSdYinIc,236 +Flask-1.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask/__pycache__/signals.cpython-36.pyc,, +flask/__pycache__/logging.cpython-36.pyc,, +flask/__pycache__/testing.cpython-36.pyc,, +flask/__pycache__/debughelpers.cpython-36.pyc,, +flask/__pycache__/_compat.cpython-36.pyc,, +flask/__pycache__/templating.cpython-36.pyc,, +flask/__pycache__/__init__.cpython-36.pyc,, +flask/__pycache__/wrappers.cpython-36.pyc,, +flask/__pycache__/globals.cpython-36.pyc,, +flask/__pycache__/app.cpython-36.pyc,, +flask/__pycache__/cli.cpython-36.pyc,, +flask/__pycache__/views.cpython-36.pyc,, +flask/__pycache__/blueprints.cpython-36.pyc,, +flask/__pycache__/helpers.cpython-36.pyc,, +flask/__pycache__/ctx.cpython-36.pyc,, +flask/__pycache__/sessions.cpython-36.pyc,, +flask/__pycache__/config.cpython-36.pyc,, +flask/__pycache__/__main__.cpython-36.pyc,, +flask/json/__pycache__/__init__.cpython-36.pyc,, +flask/json/__pycache__/tag.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL new file mode 100644 index 0000000..f21b51c --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt new file mode 100644 index 0000000..1eb0252 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask-1.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/DESCRIPTION.rst b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..7d7eef7 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/DESCRIPTION.rst @@ -0,0 +1,21 @@ +Flask-WTF +========= + +.. image:: https://travis-ci.org/lepture/flask-wtf.svg?branch=master + :target: https://travis-ci.org/lepture/flask-wtf + :alt: Travis CI Status +.. image:: https://coveralls.io/repos/lepture/flask-wtf/badge.svg?branch=master + :target: https://coveralls.io/r/lepture/flask-wtf + :alt: Coverage Status + +Simple integration of Flask and WTForms, including CSRF, file upload, +and reCAPTCHA. + +Links +----- + +* `Documentation `_ +* `PyPI `_ +* `GitHub `_ + + diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..5cbad1a --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/LICENSE.txt @@ -0,0 +1,32 @@ +Copyright (c) 2010 by Dan Jacob. +Copyright (c) 2013 by Hsiaoming Yang. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/METADATA b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/METADATA new file mode 100644 index 0000000..8dd02a4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/METADATA @@ -0,0 +1,52 @@ +Metadata-Version: 2.0 +Name: Flask-WTF +Version: 0.14.2 +Summary: Simple integration of Flask and WTForms. +Home-page: https://github.com/lepture/flask-wtf +Author: Hsiaoming Yang +Author-email: me@lepture.com +License: BSD +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask +Requires-Dist: WTForms + +Flask-WTF +========= + +.. image:: https://travis-ci.org/lepture/flask-wtf.svg?branch=master + :target: https://travis-ci.org/lepture/flask-wtf + :alt: Travis CI Status +.. image:: https://coveralls.io/repos/lepture/flask-wtf/badge.svg?branch=master + :target: https://coveralls.io/r/lepture/flask-wtf + :alt: Coverage Status + +Simple integration of Flask and WTForms, including CSRF, file upload, +and reCAPTCHA. + +Links +----- + +* `Documentation `_ +* `PyPI `_ +* `GitHub `_ + + diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/RECORD b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/RECORD new file mode 100644 index 0000000..39e63a7 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/RECORD @@ -0,0 +1,30 @@ +Flask_WTF-0.14.2.dist-info/DESCRIPTION.rst,sha256=vyJWnOD4vgnZ6x2ERr5EH1l2uzLxXCBhr_O1L6Ell2E,584 +Flask_WTF-0.14.2.dist-info/LICENSE.txt,sha256=oHX42YrP2wXdmHFiQrniwbOrmHIpJrPEz2yRasFOg1A,1490 +Flask_WTF-0.14.2.dist-info/METADATA,sha256=M8ZfImxUciRZ5Av5r1x37JnEC3wG5sacQv346wmldHU,1846 +Flask_WTF-0.14.2.dist-info/RECORD,, +Flask_WTF-0.14.2.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +Flask_WTF-0.14.2.dist-info/metadata.json,sha256=qGwhg5DSr2WilK8cvCcQsdrtDJ5NFgR1faLrO8YZCAY,1370 +Flask_WTF-0.14.2.dist-info/top_level.txt,sha256=zK3flQPSjYTkAMjB0V6Jhu3jyotC0biL1mMhzitYoog,10 +flask_wtf/__init__.py,sha256=zNLRzvfi7PLTc7jkqQT7pzgtsw9_9eN7BfO4fzwKxJc,406 +flask_wtf/_compat.py,sha256=4h1U_W5vbM9L8sJ4ZPFevuneM1TirnBTTVrsHRH3uUE,849 +flask_wtf/csrf.py,sha256=suKAZarzLIBuiJFqwP--RldEYabPj0DGfYkQA32Cc1E,11554 +flask_wtf/file.py,sha256=2UnODjSq47IjsFQMiu_z218vFA5pnQ9nL1FpX7hpK1M,2971 +flask_wtf/form.py,sha256=lpx-ItUnKjYOW8VxQpBAlbhoROJNd2PHi3v0loPPyYI,4948 +flask_wtf/html5.py,sha256=ReZHJto8DAZkO3BxUDdHnkyz5mM21KtqKYh0achJ5IM,372 +flask_wtf/i18n.py,sha256=xMB_jHCOaWfF1RXm7E6hsRHwPsUyVyKX2Rhy3tBOUgk,1790 +flask_wtf/recaptcha/__init__.py,sha256=q3TC7tZPSAZ3On3GApZKGn0EcydX4zprisbyTlhN3sQ,86 +flask_wtf/recaptcha/fields.py,sha256=kN_10iZYQcYg1EtxFp4B87BlFnnrJCktrh7bTykOVj4,453 +flask_wtf/recaptcha/validators.py,sha256=8UgjA72OxUyHVk_lm8-fGhPEvKgkMtsoFNt7yzjo0xw,2398 +flask_wtf/recaptcha/widgets.py,sha256=me-oaqMNPW2BLujNTuDHCXWcVhh6eI7wlm6_TIrIF_U,1267 +Flask_WTF-0.14.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask_wtf/recaptcha/__pycache__/fields.cpython-36.pyc,, +flask_wtf/recaptcha/__pycache__/__init__.cpython-36.pyc,, +flask_wtf/recaptcha/__pycache__/widgets.cpython-36.pyc,, +flask_wtf/recaptcha/__pycache__/validators.cpython-36.pyc,, +flask_wtf/__pycache__/_compat.cpython-36.pyc,, +flask_wtf/__pycache__/csrf.cpython-36.pyc,, +flask_wtf/__pycache__/__init__.cpython-36.pyc,, +flask_wtf/__pycache__/form.cpython-36.pyc,, +flask_wtf/__pycache__/i18n.cpython-36.pyc,, +flask_wtf/__pycache__/file.cpython-36.pyc,, +flask_wtf/__pycache__/html5.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/WHEEL b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/metadata.json b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/metadata.json new file mode 100644 index 0000000..d48bac6 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Flask", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.details": {"contacts": [{"email": "me@lepture.com", "name": "Hsiaoming Yang", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://github.com/lepture/flask-wtf"}}}, "extras": [], "generator": "bdist_wheel (0.30.0.a0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask-WTF", "platform": "any", "run_requires": [{"requires": ["Flask", "WTForms"]}], "summary": "Simple integration of Flask and WTForms.", "version": "0.14.2"} \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/top_level.txt new file mode 100644 index 0000000..716f422 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Flask_WTF-0.14.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_wtf diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..1594da5 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/DESCRIPTION.rst @@ -0,0 +1,37 @@ + +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: https://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt new file mode 100644 index 0000000..10145a2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA new file mode 100644 index 0000000..40f2b46 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/METADATA @@ -0,0 +1,68 @@ +Metadata-Version: 2.0 +Name: Jinja2 +Version: 2.10 +Summary: A small but fast and easy to use stand-alone template engine written in pure python. +Home-page: http://jinja.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Description-Content-Type: UNKNOWN +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8); extra == 'i18n' + + +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: https://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: https://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD new file mode 100644 index 0000000..67f74a2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/RECORD @@ -0,0 +1,63 @@ +Jinja2-2.10.dist-info/DESCRIPTION.rst,sha256=b5ckFDoM7vVtz_mAsJD4OPteFKCqE7beu353g4COoYI,978 +Jinja2-2.10.dist-info/LICENSE.txt,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 +Jinja2-2.10.dist-info/METADATA,sha256=18EgU8zR6-av-0-5y_gXebzK4GnBB_76lALUsl-6QHM,2258 +Jinja2-2.10.dist-info/RECORD,, +Jinja2-2.10.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +Jinja2-2.10.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 +Jinja2-2.10.dist-info/metadata.json,sha256=NPUJ9TMBxVQAv_kTJzvU8HwmP-4XZvbK9mz6_4YUVl4,1473 +Jinja2-2.10.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=xJHjaMoy51_KXn1wf0cysH6tUUifUxZCwSOfcJGEYZw,2614 +jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596 +jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726 +jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 +jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878 +jinja2/bccache.py,sha256=nQldx0ZRYANMyfvOihRoYFKSlUdd5vJkS7BjxNwlOZM,12794 +jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386 +jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 +jinja2/debug.py,sha256=WTVeUFGUa4v6ReCsYv-iVPa3pkNB75OinJt3PfxNdXs,12045 +jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400 +jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849 +jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 +jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500 +jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528 +jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197 +jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559 +jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 +jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 +jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308 +jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853 +jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 +jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875 +jinja2/runtime.py,sha256=DHdD38Pq8gj7uWQC5usJyWFoNWL317A9AvXOW_CLB34,27755 +jinja2/sandbox.py,sha256=TVyZHlNqqTzsv9fv2NvJNmSdWRHTguhyMHdxjWms32U,16708 +jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237 +jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 +Jinja2-2.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2/__pycache__/sandbox.cpython-36.pyc,, +jinja2/__pycache__/parser.cpython-36.pyc,, +jinja2/__pycache__/nodes.cpython-36.pyc,, +jinja2/__pycache__/constants.cpython-36.pyc,, +jinja2/__pycache__/_compat.cpython-36.pyc,, +jinja2/__pycache__/environment.cpython-36.pyc,, +jinja2/__pycache__/__init__.cpython-36.pyc,, +jinja2/__pycache__/exceptions.cpython-36.pyc,, +jinja2/__pycache__/runtime.cpython-36.pyc,, +jinja2/__pycache__/nativetypes.cpython-36.pyc,, +jinja2/__pycache__/bccache.cpython-36.pyc,, +jinja2/__pycache__/loaders.cpython-36.pyc,, +jinja2/__pycache__/utils.cpython-36.pyc,, +jinja2/__pycache__/defaults.cpython-36.pyc,, +jinja2/__pycache__/_identifier.cpython-36.pyc,, +jinja2/__pycache__/tests.cpython-36.pyc,, +jinja2/__pycache__/asyncsupport.cpython-36.pyc,, +jinja2/__pycache__/debug.cpython-36.pyc,, +jinja2/__pycache__/meta.cpython-36.pyc,, +jinja2/__pycache__/asyncfilters.cpython-36.pyc,, +jinja2/__pycache__/filters.cpython-36.pyc,, +jinja2/__pycache__/compiler.cpython-36.pyc,, +jinja2/__pycache__/visitor.cpython-36.pyc,, +jinja2/__pycache__/optimizer.cpython-36.pyc,, +jinja2/__pycache__/idtracking.cpython-36.pyc,, +jinja2/__pycache__/lexer.cpython-36.pyc,, +jinja2/__pycache__/ext.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL new file mode 100644 index 0000000..7332a41 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt new file mode 100644 index 0000000..32e6b75 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [babel.extractors] + jinja2 = jinja2.ext:babel_extract[i18n] + \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json new file mode 100644 index 0000000..7f5dc38 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://jinja.pocoo.org/"}}, "python.exports": {"babel.extractors": {"jinja2": "jinja2.ext:babel_extract [i18n]"}}}, "extras": ["i18n"], "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "Jinja2", "run_requires": [{"extra": "i18n", "requires": ["Babel (>=0.8)"]}, {"requires": ["MarkupSafe (>=0.23)"]}], "summary": "A small but fast and easy to use stand-alone template engine written in pure python.", "version": "2.10"} \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/venv/lib/python3.6/site-packages/Jinja2-2.10.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..28c9258 --- /dev/null +++ b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/LICENSE.txt @@ -0,0 +1,33 @@ +`BSD 3-Clause `_ + +Copyright © 2010 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +- Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA new file mode 100644 index 0000000..e532eb0 --- /dev/null +++ b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.1.0 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://www.palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/markupsafe +Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + >>> # escape replaces special characters and wraps in Markup + >>> escape('') + Markup(u'<script>alert(document.cookie);</script>') + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup('Hello') + Markup('hello') + >>> escape(Markup('Hello')) + Markup('hello') + >>> # Markup is a text subclass (str on Python 3, unicode on Python 2) + >>> # methods and operators escape their arguments + >>> template = Markup("Hello %s") + >>> template % '"World"' + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +libraries that use it. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20 + + +Links +----- + +* Website: https://www.palletsprojects.com/p/markupsafe/ +* Documentation: https://markupsafe.palletsprojects.com/ +* License: `BSD `_ +* Releases: https://pypi.org/project/MarkupSafe/ +* Code: https://github.com/pallets/markupsafe +* Issue tracker: https://github.com/pallets/markupsafe/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/markupsafe + * Windows: https://ci.appveyor.com/project/pallets/markupsafe + +* Test coverage: https://codecov.io/gh/pallets/markupsafe + + diff --git a/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD new file mode 100644 index 0000000..afbc036 --- /dev/null +++ b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/RECORD @@ -0,0 +1,16 @@ +markupsafe/_compat.py,sha256=3oSvQpEFzsJ29NKVy-Fqk6ZlRxmlCB5k0G21aN0zNtQ,596 +markupsafe/_speedups.c,sha256=VfElhhq9oulHEd2wBZ2MX9A80r4jFovsVGQD2zxmVk0,9883 +markupsafe/_constants.py,sha256=ueEz1Jxdw5TKWBbhPr4Ad_2L2MSEh73AYiYe4l3cZy4,4728 +markupsafe/__init__.py,sha256=T5J4pS7LRx1xRqfV3xz-QN_D9pSmfVDJnTrc2cTO4Ro,10164 +markupsafe/_speedups.cpython-36m-x86_64-linux-gnu.so,sha256=BS7m4DA4L7J_sXAEFkmQeW3HJStGrC1yXYRifVOaTvc,38555 +markupsafe/_native.py,sha256=fUrjjbRXIpHM-8l9QXFJ2xg5rv_48U2aN99plyL0kfs,1911 +MarkupSafe-1.1.0.dist-info/LICENSE.txt,sha256=7V249lpOdvRv2m6SF9gCDtq_nsg8tFpdeTdsWWM_g9M,1614 +MarkupSafe-1.1.0.dist-info/WHEEL,sha256=d2ILPScH-y2UwGxsW1PeA2TT-KW0Git4AJ6LeOK8sQo,109 +MarkupSafe-1.1.0.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +MarkupSafe-1.1.0.dist-info/METADATA,sha256=usFnBges7tmAH4_Yt5Ypb8Bco4R9uLUdD0V6YHbvhLw,3585 +MarkupSafe-1.1.0.dist-info/RECORD,, +MarkupSafe-1.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +markupsafe/__pycache__/_constants.cpython-36.pyc,, +markupsafe/__pycache__/_compat.cpython-36.pyc,, +markupsafe/__pycache__/__init__.cpython-36.pyc,, +markupsafe/__pycache__/_native.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/WHEEL new file mode 100644 index 0000000..92946fe --- /dev/null +++ b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.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-manylinux1_x86_64 + diff --git a/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/venv/lib/python3.6/site-packages/MarkupSafe-1.1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/METADATA b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/METADATA new file mode 100644 index 0000000..8a77324 --- /dev/null +++ b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/METADATA @@ -0,0 +1,101 @@ +Metadata-Version: 2.1 +Name: WTForms +Version: 2.2.1 +Summary: A flexible forms validation and rendering library for Python web development. +Home-page: https://wtforms.readthedocs.io/ +Author: Thomas Johansson, James Crasta +Author-email: wtforms@simplecodes.com +Maintainer: WTForms team +Maintainer-email: davidism@gmail.com +License: BSD +Project-URL: Documentation, https://wtforms.readthedocs.io/ +Project-URL: Code, https://github.com/wtforms/wtforms +Project-URL: Issue tracker, https://github.com/wtforms/wtforms/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: locale +Requires-Dist: ordereddict; python_version=="2.6" +Provides-Extra: locale +Requires-Dist: Babel (>=1.3); extra == 'locale' + +WTForms +======= + +WTForms is a flexible forms validation and rendering library for Python +web development. It is `framework agnostic`_ and can work with whatever +web framework and template engine you choose. There are various +community libraries that provide closer integration with popular +frameworks. + +To get started using WTForms, we recommend reading the `crash course`_ +in the docs. + +.. _crash course: https://wtforms.readthedocs.io/en/stable/crash_course.html +.. _framework agnostic: https://wtforms.readthedocs.io/en/stable/faq.html#does-wtforms-work-with-library-here + + +Installation +------------ + +Install and update using pip:: + + pip install -U WTForms + + +Third-Party Library Integrations +-------------------------------- + +WTForms is designed to work with any web framework and template engine. +There are a number of community-provided libraries that make integrating +with frameworks even better. + +- `Flask-WTF`_ integrates with the Flask framework. It can + automatically load data from the request, uses Flask-Babel to + translate based on user-selected locale, provides full-application + CSRF, and more. +- `WTForms-Alchemy`_ provides rich support for generating forms from + SQLAlchemy models, including an expanded set of fields and + validators. +- `WTForms-SQLAlchemy`_ provides ORM-backed fields and form generation + from SQLAlchemy models. +- `WTForms-AppEngine`_ provides ORM-backed fields and form generation + from AppEnding db/ndb schema +- `WTForms-AppEngine`_ provides ORM-backed fields and form generation + from Django models, as well as integration with Django's I18N + support. + +.. _Flask-WTF: https://flask-wtf.readthedocs.io/ +.. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/ +.. _WTForms-SQLAlchemy: https://github.com/wtforms/wtforms-sqlalchemy +.. _WTForms-AppEngine: https://github.com/wtforms/wtforms-appengine +.. _WTForms-Django: https://github.com/wtforms/wtforms-django + + +Links +----- + +- Documentation: https://wtforms.readthedocs.io/ +- License: `BSD `_ +- Releases: https://pypi.org/project/WTForms/ +- Code: https://github.com/wtforms/wtforms +- Issue tracker: https://github.com/wtforms/wtforms/issues +- Test status: + + - Linux: https://travis-ci.org/wtforms/wtforms + +- Test coverage: https://coveralls.io/github/wtforms/wtforms + + diff --git a/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/RECORD b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/RECORD new file mode 100644 index 0000000..ac67d60 --- /dev/null +++ b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/RECORD @@ -0,0 +1,147 @@ +WTForms-2.2.1.dist-info/METADATA,sha256=Aqv5s_FPo1o3VxjnX-nclKn2dBPIVOpTwggPPH-DJs0,3771 +WTForms-2.2.1.dist-info/RECORD,, +WTForms-2.2.1.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +WTForms-2.2.1.dist-info/top_level.txt,sha256=k5K62RAEkLEN23p118t3tRgvL6I_k56NiIU7Hk8Phv8,8 +wtforms/__init__.py,sha256=h4gmUHtk1Y9cGJ-l63rhrp-nC9REGdpcRPBGoJKP9hk,380 +wtforms/compat.py,sha256=buY-q7yLNO-2OlxA5QPAcdBO8urjZTtxvFnxg_1Euuo,589 +wtforms/form.py,sha256=ahME3_8CmTuvVsatV-AKqinBkOSEnLOE_nMeQLgrQEA,11608 +wtforms/i18n.py,sha256=RuMPdvfsxHGMqKySUy4DpMfEAzruPK_7gHe6GQTrekc,2175 +wtforms/meta.py,sha256=9yLQuKP4N_OiPBsPy3tBc7auldxhFryZweySDsKL8zI,3822 +wtforms/utils.py,sha256=Zg70vKv96pnHjrkSZ6KlzSo1noh20GV5IqfPy6FrOyA,1504 +wtforms/validators.py,sha256=niMtYGGRijIiZ2ruslYfRP7CTGDul_DHiR-iYen7zRg,19430 +wtforms/csrf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wtforms/csrf/core.py,sha256=Ot8eOSAZ88qeDBlSUhRqiLfyWA13g3EFJ4zWZ7EGYnc,3157 +wtforms/csrf/session.py,sha256=baww8MJ5YObyYItXX0Vz5AjxZTdOfTqti3zsD3koka0,3056 +wtforms/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wtforms/ext/appengine/__init__.py,sha256=xXkE1qkwzkkBw4o0YhWGZSZXcsV60DaLxX4fkxNcNe8,269 +wtforms/ext/appengine/db.py,sha256=IEJng34ztXLVSlLxneZ7M4kgGOZOPf9zR_6RTqv6Z1Q,18588 +wtforms/ext/appengine/fields.py,sha256=8Z2BJy7ft0fu_vZksneZ7xdVxdqHkWIMNjgnyfdKtho,7574 +wtforms/ext/appengine/ndb.py,sha256=szIwWA5FyD2lqZefayl__C2UsXMEAGQndqPYPhOH4Vk,17124 +wtforms/ext/csrf/__init__.py,sha256=bIQ48rbnoYrYPZkkGz04b_7PZ8leQY_CExEqYw8yitI,45 +wtforms/ext/csrf/fields.py,sha256=Ta3vLg9KQkpUTCnDF-7CP3IW11X0UqqhvL68sAopYTs,430 +wtforms/ext/csrf/form.py,sha256=ZxmvC3Um2qYeUncu6D390-W62mVQclzwPLP9_R7GedU,1785 +wtforms/ext/csrf/session.py,sha256=aKYb9_jgEmxIgvWuk0cdx9YAGTi9s3F4xy_0ibxyhbo,2627 +wtforms/ext/dateutil/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wtforms/ext/dateutil/fields.py,sha256=RlupqB1WX_HiKJEYqi9IAxiCElxgbBDHHuXrGF4nbYs,3429 +wtforms/ext/django/__init__.py,sha256=OQ0wr3s5_cUmUU7htHXhobyxVWJS16Ve4qBK_PLs_rw,259 +wtforms/ext/django/fields.py,sha256=pEWxaAtMq5_p8QaJPOffWsX7U4LB5f8Bq8ZBw4fedxk,4580 +wtforms/ext/django/i18n.py,sha256=VLvzJ8lQOqs5Uxnhe4aOE5StGgPEvGhfBEHNrRQFtp0,626 +wtforms/ext/django/orm.py,sha256=Mme5i_o_bJTXGKkabRz03EJmGggPMejAg95XNhYtNUc,6096 +wtforms/ext/django/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wtforms/ext/django/templatetags/wtforms.py,sha256=iCOicSMEkixm5bcJHz35Zx0h6xVwnz1H9JglB_hU69o,2826 +wtforms/ext/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +wtforms/ext/i18n/form.py,sha256=mfsavr4LGI1GhoFLsWSuSqVPHH6QNiyqoAfY94u-XP0,1608 +wtforms/ext/i18n/utils.py,sha256=rx9-pNYjIp8DLU-VQ9XxRSXHYZuFv4ktRejzVBPTDBg,530 +wtforms/ext/sqlalchemy/__init__.py,sha256=4U9BzeiFD_YF8pXRsTehei0ekP6jikt2bX4MN3GNT9s,431 +wtforms/ext/sqlalchemy/fields.py,sha256=XwOgJUJCcXvw-QGdF6q2w51m1CI4E_COq8GXb9blgI0,6846 +wtforms/ext/sqlalchemy/orm.py,sha256=6wJN-Zm4YB3st9xsXU5xJR5jQUsdSRqcbEZ7JvvGD9s,10671 +wtforms/fields/__init__.py,sha256=M-0pFfY9EEk-GoYzRkg3yvarM_iP_cRhPjpLEl5KgVU,219 +wtforms/fields/core.py,sha256=KevHc47k4mMJgRGe8Y07UrS_9o_nzXbn3U2HznpdMI0,34307 +wtforms/fields/html5.py,sha256=bwLHIBrEWICRcS80am_lBp6GitDCVIRvBdIWEPJeSz0,1995 +wtforms/fields/simple.py,sha256=dY7cYfb6PXMDjUefXcDeTDWpv3UGyr_BMlebJAeoRso,2218 +wtforms/locale/README.md,sha256=xL3Ain6UPZK3UdL8tMrIKwfodEsPT0IYCVDpI6do524,1062 +wtforms/locale/wtforms.pot,sha256=Sqe4LRpObVRUc30htYXgZuueKYfW7wt2lNVKtM_Jrr0,4170 +wtforms/locale/ar/LC_MESSAGES/wtforms.mo,sha256=r1DDYnBCr1hT7KwEG3NpQLR52i4j_-er5ENIVqT9Sbo,4530 +wtforms/locale/ar/LC_MESSAGES/wtforms.po,sha256=Qkhg_pS-ZEf7jEZz76mDC47UPpqWcU_8t7L88ALAPvk,6262 +wtforms/locale/bg/LC_MESSAGES/wtforms.mo,sha256=aPnglyINf0hH4FGUM3U5OJpqcJT_8XRx6GiaD4Jif3g,4297 +wtforms/locale/bg/LC_MESSAGES/wtforms.po,sha256=xflJaMOGUTNN7zbFMWL-FbMVjmj-Svmvkek84mJl5NI,6356 +wtforms/locale/ca/LC_MESSAGES/wtforms.mo,sha256=zBX48Ru44A2O82FXwC9CwzU3_FiFkUyb4KGNya4toSg,3425 +wtforms/locale/ca/LC_MESSAGES/wtforms.po,sha256=oT09ydRQNsmf0a1uwskao0wfbwQqAh2tKXjFqI_iscw,5465 +wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo,sha256=MJQPoiMNPfdHYX5eQQ2OW7PmvQ9BFETva2qm3xmPSvo,3618 +wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po,sha256=MZ1Iv28-oX4dqzSPgGo65YU3iijeBmYBKZSGsl8YYS0,5596 +wtforms/locale/cy/LC_MESSAGES/wtforms.mo,sha256=8pJPG9dguZLej33ksWSwWmCOKIJ7VmpNVlaDMb30_lc,3371 +wtforms/locale/cy/LC_MESSAGES/wtforms.po,sha256=DTGkDUWJ1MsZqFPV8YhwHaBI1uJP6uXwiud7K3LW1yw,5415 +wtforms/locale/de/LC_MESSAGES/wtforms.mo,sha256=D4BRsJeeT_cKYagO7W1LHQ8YpwC2c7_0hbv3tDgk82E,3412 +wtforms/locale/de/LC_MESSAGES/wtforms.po,sha256=BF7F3vwQOAL_yaZTHi7x2KZnaCTzz3MNUNCtuc6e47A,5457 +wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo,sha256=lBUgz2N_AlkXB4W-CxaNGuHdwhgTrYCPtwM9DWL-pP0,3418 +wtforms/locale/de_CH/LC_MESSAGES/wtforms.po,sha256=LiAqravsNbETdXHJiOi3vJD4o3hWrTRZWSHcLNvHjgc,5477 +wtforms/locale/el/LC_MESSAGES/wtforms.mo,sha256=r0_oQGB_KYBZdSmFsielQMCF0P7rgsLDCA28u37XAkw,4307 +wtforms/locale/el/LC_MESSAGES/wtforms.po,sha256=snlBcC-cjlFdpIbSG9pRGYlWFhl1EaQX72Umv2PWfp8,6345 +wtforms/locale/en/LC_MESSAGES/wtforms.mo,sha256=DCJnvT-_j_oec9za8vxn0FZSog4mm5PnaiWIpesctDE,3285 +wtforms/locale/en/LC_MESSAGES/wtforms.po,sha256=-GGpFQm9Sdz3Yg0EqltIGTEcOwnYqmepRSREkHV_UVU,5347 +wtforms/locale/es/LC_MESSAGES/wtforms.mo,sha256=U_oe-S3-i6A2VsBTVKxZ8N5QAEbpqXBlenSIaLnFupE,3394 +wtforms/locale/es/LC_MESSAGES/wtforms.po,sha256=P36kwWq3LZNjYHXTyoyMl86WziWpZYXxGFsFiqev1oU,5368 +wtforms/locale/et/LC_MESSAGES/wtforms.mo,sha256=Ugx0IpG1TJtP-DKpNZiVyo-L5F8ESrr_qCpPXR96pww,3456 +wtforms/locale/et/LC_MESSAGES/wtforms.po,sha256=doeYijsnPkyHy_JK4JRH6AQdHG8uaQTQWYwsCP6_Iuk,5497 +wtforms/locale/fa/LC_MESSAGES/wtforms.mo,sha256=exJzwjxXvOALqJhsQetN9Kcad4Lx62Exvnx2jtzja8Q,4137 +wtforms/locale/fa/LC_MESSAGES/wtforms.po,sha256=MHjVwlp-MHMV-TTUUkUYtuBdtbEjfV0jzVSgWHFv80Q,6149 +wtforms/locale/fi/LC_MESSAGES/wtforms.mo,sha256=NiodjvNOW25UkxEpuCioXdpvjbGwPoYmz0dfiMxE3S8,3416 +wtforms/locale/fi/LC_MESSAGES/wtforms.po,sha256=4uP6A6sfNoATdRR_8PlecqiiTsVzIp9qpcn9qe0jGMA,5456 +wtforms/locale/fr/LC_MESSAGES/wtforms.mo,sha256=BoZI4I1MK0-nipyLWOSG-s_55E9x9eG0WqYdz1qZ1KQ,3484 +wtforms/locale/fr/LC_MESSAGES/wtforms.po,sha256=60tb7Uyco3tdKc1Z4sdvwta46V_RGSmvXM9SdvuBvhg,5529 +wtforms/locale/he/LC_MESSAGES/wtforms.mo,sha256=UhetGKepgOnGXa5IsjZBdOi5IbPLCufpIugkkDuXkjQ,3649 +wtforms/locale/he/LC_MESSAGES/wtforms.po,sha256=GJy7zG0ik8U0YnubNlfjjl9iPT62w3XyaAP4kNCntkQ,5657 +wtforms/locale/hu/LC_MESSAGES/wtforms.mo,sha256=Z-qEeJI422dmm7-2qJIgCuCS1eyS2pJfoavPnGK2334,3544 +wtforms/locale/hu/LC_MESSAGES/wtforms.po,sha256=eiyNXYa4_XLQWRd-j4KmAXml27cYAPjIBhjjIv9WMbE,5492 +wtforms/locale/it/LC_MESSAGES/wtforms.mo,sha256=petuqW4x1p1S69sJax15WpLQryWoDRXW0uQjr58E9Jw,3510 +wtforms/locale/it/LC_MESSAGES/wtforms.po,sha256=EuI0Plf7nLfg5NcRPqQvfg3z7fpfIdRQGBmyq1ivpGE,5556 +wtforms/locale/ja/LC_MESSAGES/wtforms.mo,sha256=thfPsxKfihz2wNvb9LA7MzYb4PnfyXT81gaE_802AlM,3736 +wtforms/locale/ja/LC_MESSAGES/wtforms.po,sha256=ydUzTwxnk8sUQcPTeS7AuU7sgArIMWgbDzxFt85mhG8,5753 +wtforms/locale/ko/LC_MESSAGES/wtforms.mo,sha256=ZRJGcizRhJifuw4rElZ6Bb-hNdH3zqCYzxhwYJisCpU,3851 +wtforms/locale/ko/LC_MESSAGES/wtforms.po,sha256=9os2sRuqxoX0fTWHr47IvBwlkY_sDoLKdn3byS7MfjQ,5842 +wtforms/locale/nb/LC_MESSAGES/wtforms.mo,sha256=0YxYTElaTGBpIurcZqZHPU2lXslt3UNF_HOw575OAKM,3337 +wtforms/locale/nb/LC_MESSAGES/wtforms.po,sha256=NXrr3nrnoOo2x2t0g8UZXT2Jm9KQnkYdnieeoB7U9Yw,5387 +wtforms/locale/nl/LC_MESSAGES/wtforms.mo,sha256=8wLTkRK82jpG5oDkqM-jLNVLYHte4fRHYF6VAN7lB6U,3350 +wtforms/locale/nl/LC_MESSAGES/wtforms.po,sha256=9xSoztymVdIgFBA2vnzaHeSK4qEGTGbiPbfwjdcHN0k,5388 +wtforms/locale/pl/LC_MESSAGES/wtforms.mo,sha256=QUs5iz_IOoo6oCVmcpWWNNkXyqYA0X01wERmQYQiXYo,3610 +wtforms/locale/pl/LC_MESSAGES/wtforms.po,sha256=XrkwltOhyLHrOOgxYVvcmR2Hcw4LUN3_sZEdJofS5Vk,5652 +wtforms/locale/pt/LC_MESSAGES/wtforms.mo,sha256=PC5HRiM-QYt4GX3eMPapzG31jLKmo3zt6nKGVb_o174,3438 +wtforms/locale/pt/LC_MESSAGES/wtforms.po,sha256=cXIZJJZ4UDDR24yrQ-XYck3klonRZd9Ajt8A7dqqJc4,5481 +wtforms/locale/ru/LC_MESSAGES/wtforms.mo,sha256=ski71qWfnwGL9GtZEQZ1fksHBeZsePxi4ZN16AlLeZE,4406 +wtforms/locale/ru/LC_MESSAGES/wtforms.po,sha256=3eeI-CxivICl6FzYpKrqfYnz2rB68hMNCicC_9aM90s,6407 +wtforms/locale/sk/LC_MESSAGES/wtforms.mo,sha256=Lo_5eGNF_LnkJsJLOde_YNWE_F3UZtScFTFlO4v-EyU,3548 +wtforms/locale/sk/LC_MESSAGES/wtforms.po,sha256=ywPpnxYnHgEkD6Ab7LJgyqgC6dIj8cBmn6hB21aS3NI,5586 +wtforms/locale/sv/LC_MESSAGES/wtforms.mo,sha256=U7noK9cso_pRgaQcvF4duRQ69joI7SHN0XcHyd0mAVg,3376 +wtforms/locale/sv/LC_MESSAGES/wtforms.po,sha256=jMtpwUlQPbi4Xiut9KNfLjGhsjqmys1Y_iGZ3lJA4NQ,5416 +wtforms/locale/tr/LC_MESSAGES/wtforms.mo,sha256=kp3J8k2FVBaXVVJJclGnUmZTEUYHS6Hg1v2baGwtReo,3391 +wtforms/locale/tr/LC_MESSAGES/wtforms.po,sha256=PFo_e3vKCMgKtkcQSaXqNOlr-YgzxvgUtg8Ju5M-8f8,5431 +wtforms/locale/uk/LC_MESSAGES/wtforms.mo,sha256=5iZS-8LmCyeteqN3TXQ15byNTGJbjpsDa8AF3zh6L1o,4451 +wtforms/locale/uk/LC_MESSAGES/wtforms.po,sha256=fIijOGm8gXO-yZkdYoX6kWMPXZE6j9yALhekfQCK5KU,6520 +wtforms/locale/zh/LC_MESSAGES/wtforms.mo,sha256=yCzjCCwAf5yu80NhllpGqlk7V6PBFyJYfoZ6IF2dQnM,3362 +wtforms/locale/zh/LC_MESSAGES/wtforms.po,sha256=ZIh59O9rnjZMRpdKFfvrk59wouOAUHyjZS0f-TMsN6U,5378 +wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo,sha256=iha5oFUQDVs7wPBpcWLLAP_Jgm42Ea9n9xIlaCsUsNE,3204 +wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po,sha256=a7q2T9fdwN_xESBCD4umHMfSptN7Qt-abjO9UFRWDBo,5218 +wtforms/widgets/__init__.py,sha256=nxI0oIsofuJCNgc4Oxwzf3_q3IiCYZTSiCoEuSRZeJM,124 +wtforms/widgets/core.py,sha256=X3I5PRFbPeX1nU3DrPpsJyglsObujdN1hMxHHFTkKOk,11150 +wtforms/widgets/html5.py,sha256=LDnNegNTx-LYpw4YkbymvS2TaA2V03p2rRdYN83skYQ,2440 +WTForms-2.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wtforms/__pycache__/__init__.cpython-36.pyc,, +wtforms/__pycache__/utils.cpython-36.pyc,, +wtforms/__pycache__/form.cpython-36.pyc,, +wtforms/__pycache__/i18n.cpython-36.pyc,, +wtforms/__pycache__/meta.cpython-36.pyc,, +wtforms/__pycache__/validators.cpython-36.pyc,, +wtforms/__pycache__/compat.cpython-36.pyc,, +wtforms/csrf/__pycache__/__init__.cpython-36.pyc,, +wtforms/csrf/__pycache__/core.cpython-36.pyc,, +wtforms/csrf/__pycache__/session.cpython-36.pyc,, +wtforms/widgets/__pycache__/__init__.cpython-36.pyc,, +wtforms/widgets/__pycache__/core.cpython-36.pyc,, +wtforms/widgets/__pycache__/html5.cpython-36.pyc,, +wtforms/fields/__pycache__/simple.cpython-36.pyc,, +wtforms/fields/__pycache__/__init__.cpython-36.pyc,, +wtforms/fields/__pycache__/core.cpython-36.pyc,, +wtforms/fields/__pycache__/html5.cpython-36.pyc,, +wtforms/ext/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/django/templatetags/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/django/templatetags/__pycache__/wtforms.cpython-36.pyc,, +wtforms/ext/django/__pycache__/fields.cpython-36.pyc,, +wtforms/ext/django/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/django/__pycache__/i18n.cpython-36.pyc,, +wtforms/ext/django/__pycache__/orm.cpython-36.pyc,, +wtforms/ext/csrf/__pycache__/fields.cpython-36.pyc,, +wtforms/ext/csrf/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/csrf/__pycache__/form.cpython-36.pyc,, +wtforms/ext/csrf/__pycache__/session.cpython-36.pyc,, +wtforms/ext/dateutil/__pycache__/fields.cpython-36.pyc,, +wtforms/ext/dateutil/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/i18n/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/i18n/__pycache__/utils.cpython-36.pyc,, +wtforms/ext/i18n/__pycache__/form.cpython-36.pyc,, +wtforms/ext/appengine/__pycache__/fields.cpython-36.pyc,, +wtforms/ext/appengine/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/appengine/__pycache__/db.cpython-36.pyc,, +wtforms/ext/appengine/__pycache__/ndb.cpython-36.pyc,, +wtforms/ext/sqlalchemy/__pycache__/fields.cpython-36.pyc,, +wtforms/ext/sqlalchemy/__pycache__/__init__.cpython-36.pyc,, +wtforms/ext/sqlalchemy/__pycache__/orm.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/WHEEL b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/WHEEL new file mode 100644 index 0000000..1316c41 --- /dev/null +++ b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/top_level.txt new file mode 100644 index 0000000..26d80fd --- /dev/null +++ b/venv/lib/python3.6/site-packages/WTForms-2.2.1.dist-info/top_level.txt @@ -0,0 +1 @@ +wtforms diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..675f08d --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,80 @@ +Werkzeug +======== + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +* An interactive debugger that allows inspecting stack traces and source + code in the browser with an interactive interpreter for any frame in + the stack. +* A full-featured request object with objects to interact with headers, + query args, form data, files, and cookies. +* A response object that can wrap other WSGI applications and handle + streaming data. +* A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables from + URLs. +* HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +* A threaded WSGI server for use while developing applications locally. +* A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +* Website: https://www.palletsprojects.com/p/werkzeug/ +* Releases: https://pypi.org/project/Werkzeug/ +* Code: https://github.com/pallets/werkzeug +* Issue tracker: https://github.com/pallets/werkzeug/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/werkzeug + * Windows: https://ci.appveyor.com/project/davidism/werkzeug + +* Test coverage: https://codecov.io/gh/pallets/werkzeug + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..1cc75bb --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright © 2007 by the Pallets team. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA new file mode 100644 index 0000000..bfc3c4e --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.0 +Name: Werkzeug +Version: 0.14.1 +Summary: The comprehensive WSGI web application library. +Home-page: https://www.palletsprojects.org/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Description-Content-Type: UNKNOWN +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: dev +Requires-Dist: coverage; extra == 'dev' +Requires-Dist: pytest; extra == 'dev' +Requires-Dist: sphinx; extra == 'dev' +Requires-Dist: tox; extra == 'dev' +Provides-Extra: termcolor +Requires-Dist: termcolor; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog; extra == 'watchdog' + +Werkzeug +======== + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +* An interactive debugger that allows inspecting stack traces and source + code in the browser with an interactive interpreter for any frame in + the stack. +* A full-featured request object with objects to interact with headers, + query args, form data, files, and cookies. +* A response object that can wrap other WSGI applications and handle + streaming data. +* A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables from + URLs. +* HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +* A threaded WSGI server for use while developing applications locally. +* A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +* Website: https://www.palletsprojects.com/p/werkzeug/ +* Releases: https://pypi.org/project/Werkzeug/ +* Code: https://github.com/pallets/werkzeug +* Issue tracker: https://github.com/pallets/werkzeug/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/werkzeug + * Windows: https://ci.appveyor.com/project/davidism/werkzeug + +* Test coverage: https://codecov.io/gh/pallets/werkzeug + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD new file mode 100644 index 0000000..3f720ae --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/RECORD @@ -0,0 +1,97 @@ +Werkzeug-0.14.1.dist-info/DESCRIPTION.rst,sha256=rOCN36jwsWtWsTpqPG96z7FMilB5qI1CIARSKRuUmz8,2452 +Werkzeug-0.14.1.dist-info/LICENSE.txt,sha256=xndz_dD4m269AF9l_Xbl5V3tM1N3C1LoZC2PEPxWO-8,1534 +Werkzeug-0.14.1.dist-info/METADATA,sha256=FbfadrPdJNUWAxMOKxGUtHe5R3IDSBKYYmAz3FvI3uY,3872 +Werkzeug-0.14.1.dist-info/RECORD,, +Werkzeug-0.14.1.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 +Werkzeug-0.14.1.dist-info/metadata.json,sha256=4489UTt6HBp2NQil95-pBkjU4Je93SMHvMxZ_rjOpqA,1452 +Werkzeug-0.14.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=NR0d4n_-U9BLVKlOISean3zUt2vBwhvK-AZE6M0sC0k,6842 +werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 +werkzeug/_internal.py,sha256=GhEyGMlsSz_tYjsDWO9TG35VN7304MM8gjKDrXLEdVc,13873 +werkzeug/_reloader.py,sha256=AyPphcOHPbu6qzW0UbrVvTDJdre5WgpxbhIJN_TqzUc,9264 +werkzeug/datastructures.py,sha256=3IgNKNqrz-ZjmAG7y3YgEYK-enDiMT_b652PsypWcYg,90080 +werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505 +werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175 +werkzeug/formparser.py,sha256=mUuCwjzjb8_E4RzrAT2AioLuZSYpqR1KXTK6LScRYzA,21722 +werkzeug/http.py,sha256=RQg4MJuhRv2isNRiEh__Phh09ebpfT3Kuu_GfrZ54_c,40079 +werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553 +werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519 +werkzeug/routing.py,sha256=2JVtdSgxKGeANy4Z_FP-dKESvKtkYGCZ1J2fARCLGCY,67214 +werkzeug/script.py,sha256=DwaVDcXdaOTffdNvlBdLitxWXjKaRVT32VbhDtljFPY,11365 +werkzeug/security.py,sha256=0m107exslz4QJLWQCpfQJ04z3re4eGHVggRvrQVAdWc,9193 +werkzeug/serving.py,sha256=A0flnIJHufdn2QJ9oeuHfrXwP3LzP8fn3rNW6hbxKUg,31926 +werkzeug/test.py,sha256=XmECSmnpASiYQTct4oMiWr0LT5jHWCtKqnpYKZd2ui8,36100 +werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396 +werkzeug/urls.py,sha256=dUeLg2IeTm0WLmSvFeD4hBZWGdOs-uHudR5-t8n9zPo,36771 +werkzeug/useragents.py,sha256=BhYMf4cBTHyN4U0WsQedePIocmNlH_34C-UwqSThGCc,5865 +werkzeug/utils.py,sha256=BrY1j0DHQ8RTb0K1StIobKuMJhN9SQQkWEARbrh2qpk,22972 +werkzeug/websocket.py,sha256=PpSeDxXD_0UsPAa5hQhQNM6mxibeUgn8lA8eRqiS0vM,11344 +werkzeug/wrappers.py,sha256=kbyL_aFjxELwPgMwfNCYjKu-CR6kNkh-oO8wv3GXbk8,84511 +werkzeug/wsgi.py,sha256=1Nob-aeChWQf7MsiicO8RZt6J90iRzEcik44ev9Qu8s,49347 +werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 +werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575 +werkzeug/contrib/cache.py,sha256=xBImHNj09BmX_7kC5NUCx8f_l4L8_O7zi0jCL21UZKE,32163 +werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179 +werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814 +werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564 +werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334 +werkzeug/contrib/lint.py,sha256=Mj9NeUN7s4zIUWeQOAVjrmtZIcl3Mm2yDe9BSIr9YGE,12558 +werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151 +werkzeug/contrib/securecookie.py,sha256=uWMyHDHY3lkeBRiCSayGqWkAIy4a7xAbSE_Hln9ecqc,12196 +werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577 +werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453 +werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398 +werkzeug/debug/__init__.py,sha256=uSn9BqCZ5E3ySgpoZtundpROGsn-uYvZtSFiTfAX24M,17452 +werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 +werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 +werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264 +werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +Werkzeug-0.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +werkzeug/debug/__pycache__/__init__.cpython-36.pyc,, +werkzeug/debug/__pycache__/console.cpython-36.pyc,, +werkzeug/debug/__pycache__/repr.cpython-36.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-36.pyc,, +werkzeug/__pycache__/routing.cpython-36.pyc,, +werkzeug/__pycache__/websocket.cpython-36.pyc,, +werkzeug/__pycache__/test.cpython-36.pyc,, +werkzeug/__pycache__/datastructures.cpython-36.pyc,, +werkzeug/__pycache__/formparser.cpython-36.pyc,, +werkzeug/__pycache__/_compat.cpython-36.pyc,, +werkzeug/__pycache__/__init__.cpython-36.pyc,, +werkzeug/__pycache__/exceptions.cpython-36.pyc,, +werkzeug/__pycache__/wrappers.cpython-36.pyc,, +werkzeug/__pycache__/http.cpython-36.pyc,, +werkzeug/__pycache__/filesystem.cpython-36.pyc,, +werkzeug/__pycache__/utils.cpython-36.pyc,, +werkzeug/__pycache__/serving.cpython-36.pyc,, +werkzeug/__pycache__/posixemulation.cpython-36.pyc,, +werkzeug/__pycache__/_internal.cpython-36.pyc,, +werkzeug/__pycache__/wsgi.cpython-36.pyc,, +werkzeug/__pycache__/testapp.cpython-36.pyc,, +werkzeug/__pycache__/script.cpython-36.pyc,, +werkzeug/__pycache__/security.cpython-36.pyc,, +werkzeug/__pycache__/useragents.cpython-36.pyc,, +werkzeug/__pycache__/local.cpython-36.pyc,, +werkzeug/__pycache__/urls.cpython-36.pyc,, +werkzeug/__pycache__/_reloader.cpython-36.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-36.pyc,, +werkzeug/contrib/__pycache__/limiter.cpython-36.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-36.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-36.pyc,, +werkzeug/contrib/__pycache__/__init__.cpython-36.pyc,, +werkzeug/contrib/__pycache__/testtools.cpython-36.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-36.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-36.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-36.pyc,, +werkzeug/contrib/__pycache__/jsrouting.cpython-36.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-36.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-36.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL new file mode 100644 index 0000000..0de529b --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.26.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json new file mode 100644 index 0000000..bca8d12 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"generator": "bdist_wheel (0.26.0)", "summary": "The comprehensive WSGI web application library.", "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"project_urls": {"Home": "https://www.palletsprojects.org/p/werkzeug/"}, "contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}}}, "license": "BSD", "metadata_version": "2.0", "name": "Werkzeug", "platform": "any", "extras": ["dev", "termcolor", "watchdog"], "run_requires": [{"requires": ["coverage", "pytest", "sphinx", "tox"], "extra": "dev"}, {"requires": ["termcolor"], "extra": "termcolor"}, {"requires": ["watchdog"], "extra": "watchdog"}], "version": "0.14.1"} \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/venv/lib/python3.6/site-packages/Werkzeug-0.14.1.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc b/venv/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19829c478f7dea011a33b52097ae726b3110e685 GIT binary patch literal 275 zcmXr!<>lJ8hcBj%fq~&M5W@izkmUfx#Y#XTg&~R|l`(}eo2f`Hg(-zOhbfmiikXoi zmARRLks*a8m_d`ZN;;@CPoX3uRlzl}xY9GPxFj(rMsH#ada5BUq<>Rxdr+KnFYE@rI|S?x_QQ_=EVh7X8H(|^pQ=_E2zB1VUwGm VQks)$#|Sj07-SX;69*#?BLK^5O$q=2 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/__pycache__/six.cpython-36.pyc b/venv/lib/python3.6/site-packages/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe448d1441918bd3294910f57c57d3b8c2b7fe53 GIT binary patch literal 26448 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/__pycache__/abc.cpython-36.pyc b/venv/lib/python3.6/site-packages/cachetools/__pycache__/abc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ad1b248258242e64098b4fb7d5b636b2dec7b01 GIT binary patch literal 1409 zcmZvc&u`N(6vu5RP17{(#z3$Qi30~jCAJCJaiB^3I-pfZyG2M*8oOKC{F?0`Z3-8* ze};d_CnQe%3!Hc_-P*Oot)E})7yI+RdCBWu&s+P||N6xyD*P01(1ZQi;fyd~JAb!i2Ta3*cxUSd2uCIjaW>_P_AtVJVLq?Hz7 zl9h$jLzwHsoR(3nGoeol9%JZDv%ooou7+R)2`DE48NF!7OXYq@BW_7%DplvcSco`@|{e+dU+NJz86RFsnA7{s@rZf zig(L%cVA6IPQNu8xVe zV5C1lz9tdV4Z|!^3X%@Pfo>ZxY!Ar=~TTI&vNHw*a|@6dH6o zYz`k-3mVhrv!}R|jlQp+%2J04xONUS*kHY11K~yCF*5b-=eef^)6r#!Vi%Uo#s@rKSgDPCe6g6-{oy{i|S}68c*6=di4> z2$0W%M}D!jocZn|7Nvo|Z`?4I;AI$?ai^6O?1d}KQR&67r%WUS`e%o^#=6lWBpo19WN>>svBvydw z#zmUK{z;K5W5LVXK$!kfrK3?QuD=(}?Z%bjBvD#OWAg-%{=;D0gISty@vGA4T4d3AaEIxD^y!N>E#gq6%7CTD1})4}e-^RT^zPV_19bH8X2O zEawI1NAxfBFYQyMKJgd&)bGrCZ6^f8S~GLz;yJhPoHO5SY*gz1)cy?C82gv4d>-ig zXyz_D$s~{2fVVkk(vfcL4BWQM*{@7`(m!O3!g+2)u9{cqmdXsKr^JBxSMgIOIWep zf46U?gVC)~G`hJrj$(Oppuhg=WvJw>PS|;&(j|23Hz(b2l0F5rP1xOT0B>Ea_Z-$yft=$5!@ zy8tpF=@W}B4hZMiD$BAAfU!WX$qL3bxh|_1D{@2DFs{qGY+$U)O}T|}L!OeSG1gRF zo{?t{*^IXvpwG!|OK++zd0t+y^eO4Utrs)@0fB1r!=rH;?!~G($m5}zCQZ2cm1>5j z88!`q2b&gv%|y?Mz0hDS4vpE_JsC^4q3G1nm8mmjf=yYErM$=bYx+{^%rF=3eDoy8 z%%4(UDiCKwwVbU1)do?OboCbQ%RCu%Qn<)U4s2m-Ig?=;W{qO6GuGPf*Nc@w_?i~x zu+7Tzxju!PS3GNh3v5KgC>7!?HVyfnagUdHmBYgrCp9YqLMlJjA%W?mkq}|y=`#?d zU61v63On@N9^5^n6(6nC_0HxIHo1J&T)(Qngb%EY_lPbuz@*iJErhTJ7ed!@Z|233 zNj1rr`4ss^Z-dt7(6x9T8cVnqN@+FHLR`ifL(pd2u}XO>3gt(R1mZeQT7|v3-pn)6lPY?zd(?f2QGR(b!Pm)n|f2X@9AcW3^(I% zI3cd*_RHoDMvoMldVQv!zP^CDKlRQrd;T$Ir5V(F`Q0B-+y1Adhq!J2uWfeV4{`f} zPgw7{Q+^jW<-4F@B;4kIi!>|zIld=#n=TP*Niz=hbJZ&6-Xkn#mES3sT60KZ}adXDu=IV`y~Y*9ii^JBq+I?zdmX&4QS5I+%P zx{mS5Rsq4~_Q_nyEh+dC)(RVNO|ka@zPgG1U(gD63&by?=18tNq9eG$7ZiXLdU#>L zY&zHUy%~Xy2=Utr$7O1>TOZHPjn(i&+{!}Wgb)u`m~9l+v^z(5Q7W~;Or9Z_ky?{W zPhU`}dL0eM0~Du;Y9`%ginR_^vmK;9N`oh7KpP~x3-0b@&V8PBKbAWsW;IMt=Ki7l zTV(VnDmaTMgX z^gUY^fuI+=rXubCLNR^s&jcvQ$Ep`s9QdmuF{k;goU)eP88LT zEEwrzgm>h=b%(w|YgLnmY1A30^hF|%S7a-+eQVJpfMhTi(FNRdN={`h2!c}32z+{Z z(XZ-PefwP4Mb*U9t~-Xo@U+tuE14Vabu`&CDZLI$f#E+CC literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/__pycache__/func.cpython-36.pyc b/venv/lib/python3.6/site-packages/cachetools/__pycache__/func.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34d1c5a9b71f1de5569669b56135d9433d498661 GIT binary patch literal 4198 zcmcgvTW=f36`sqITvC)o%ko9Ou5+syKy;HdOFt#?KirClyP zyR<8UDgw}j{Ee0`7iV--hF#=(EpI(rcVC#eAl?5)qGuFF4UMlD@R9<2$x3`6b(y{qlYTloM5A z*LOMlhV?v$>FQq1Y;i`fovjtKzhOObpQ(~6M+`Hw zIuoz>E0(TBXX90W74!}NoR+)i)v{`+GipVhedLUVf8pm$t*Ud+m^!B~j-|hb{&{r) z{R?^({Y&aCwWcmT_D>Z-b|OS{+9#cipssYQ%jSC`dwUEVEY z%u$|N!kDMzSFHK&@TXhbgI<^=NtCuCGw6gtxTCkcFp2v?)_oXhFV=C=9d>(+(Ykl<+`CP? zSh_u~ymS5Rr@bJ&bf+?U!>Ldj=r%*j50mXj}b?)4rfgPyW` zZH6QoJ=6-6+bF4vDq|yjhi^CmAtT)*1X3Ms|BadRSn#ipZ)I`+R=?X{e>mtyYCSd| ze(*TZ>Q+eDScM!X3Hw%m->l%<8?*~;$Hegbi4(P^5;n`Z+v)UzSa&*kt<#AUHHe6= zcRG&;K~&6`GvJZCeUtRH$qMH7bjPX-SYpnix{8uIs9fO)JMwB6JuI2SsKhg7p_Iy* zKv@DT<-9RH_*B;+DS{qqODGo1iy$(#%SSAOQpSA5M`G;2br`sa&0KbS+f8YzSVj_e zd)*9DmbRlL$S{76#wCm-FJ;|Wo6~|_!~FM93OM<2?ewWyQ=TVuP5QRSBRuR;_@-su zv%aHB#2$TYXV)NBstU$r=IoY6@`#NQle6+jDt9c>-Vqzg zP6aBK9d{&9S4R}3s+)!Y4^iwx=c}XG^L+^7h`+eR*^zi44%h)dV!P}>pymhi8))ZO ztj+Gjd`66nXC%iCc)~Ab0Vv@C7r9MtN719{m}Lx^22~bvTG5nw$$Dn)Lpz z>U*3G>m=kDafbvf6mcX#vEPdg2s;;h;wKhBgrHIw>7eie$p1DNns=yrm#UdTC$H%0FLLht{~n8f6@UkA}ZTN)|B3Cttpn!TsC<$F1Q(kxkIbBBU< zE|K?M33BDB3Hk`Ux3NJ=Ue0*ULhQm|9KOUo^aV!FgD&&o`>z4}gk`?a=@g{ubec6o z-t4>CeqSq`#;@!I=?)!BVmzV)JS!MpZcvzoz7#xSTcVkKx8 zF6AQX*{gvV{^j%OrO3+?j{x+7`HksmH`_sfewRWJhyuD^WjjIUrNI-O);v6eK7GD5 zNe5e=(di({Qtx4qYUSbX6?k`bkY?T;qaP1+FN^lQdo*4v&+uT%Czi8&(-=JwOQ54Q>l9D1moUGG}xOn|ybE@rQHl%r>EW=CW( zGI6!PzcIK9SNosFDZ&Y=6aT_N8KmdyNMfa(|bZmqjl0D>6T`%t_YUa zAw3$P>-{UCUBtw>yD}t5<%Eqv{ zv_ByhGm(o3cG4Deccb|4`IN4YDdieR)P;*X8D1ffa+dgtsPoAy99iZ|PNUkW*4AtF IT79Md9ZH746951J literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/__pycache__/keys.cpython-36.pyc b/venv/lib/python3.6/site-packages/cachetools/__pycache__/keys.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7b99fa8523f5c7d81a5d478167158cbb0d4c69b GIT binary patch literal 1704 zcmb7EQHvWl5SFy^dhOi#(valZBt7<}6c^%aT1rAVj?flbC|sc_eK0A@-b%i+z3cT! zyGhUNJ^7yVKl+#SROnOxLZ14K+;fa6lnOM`jI=Y~e45!WcXzvcfAn5Gk&OMxHU@O| z0@IREY{(Q>BIkt|3eHq_7<|W6ONG}=g<39yVM~WgHsZs!YOCOy4I>pPiM69TFIoTA z;?p1WWjv~9Sv4+aHXfBGE_6|j7vtGktaMhIv?`4q{Dp9=&)r^nYRkN?bTTgHrKw!| zJhkUjed(g=a;_D28C|^@0X8o%?Q;mth8&oM;=@48Noxe`K*fPlPC{r>wV(mH*Fx2X z)>a%yBe#=$k4RemT+efTk_q^uK>=ufgK1-khE3R&XoO|=dN zFX2~Tpo_%Mb)jdK9h~%A9)}BT zUAWMque5Tlait53H=DjGQZwxfC-I4O;q(oy+v!oAJR;mg3kxKFAl7-&**dSUp%C(h zzva{@6{mm5H7wsEnx>gn3}T%STAKGE8un}N ziUT9i{K7c9Kr`PouB2GtLJU54{Ph+I?>a|kdZvGyo8vw?BhQj89^U+#21j|BrMW#G ztnaN+5P~&|2P+hJUWqGk1SF{TEhOe4?x5$0bH@|&G1e_O<^VP-qkn+(rJ)GsE(uE1 z>_foEN3^GyEO`qq` ud{`<27nY|JomJ*TDDS;&#P$8-e;Luys{4-VwJf!n6gxr&w?Bx2sPi{lU3H@X literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/__pycache__/lfu.cpython-36.pyc b/venv/lib/python3.6/site-packages/cachetools/__pycache__/lfu.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b97621de1d013b51f5f59511a0aa63da9f5b3bb6 GIT binary patch literal 1576 zcmZux%Wm676rCB8B1JvyxPj23T@XbJgg|1$Z5Bn476y!_iyB(ANFRiO3Bwt+RQU1? z8AO7-iTpG9C9Vo|m0#$p_l`tGZcSk>?{F^Xo;f^6Uynxq!C&LcQ=5>#$=(HXat1>` zh9HQb8OdoxDdsF=5fhfMGb^_vo01=ha76Ehh@Q09R^$lwGYQ@I@Fodqdl0|WW!BV^ zr+HPXditJj7M$}q`BNrX)?F4PXE5{y1W6()2(+S+B}UlrhDNq@=Dis;4QbSanF}*l zc(CTe%!659_%QRtKn!n4)HiU(t#|S4x#_q(y^yi4gJ()!HL|F)Metlp5j=o`Fh~$o z08lfT!(v>gWpO-B5E)*0M{>?#=+7Y3WKLIPMOSQXQBt$HwI(aVZ9#wpIt?9#<*mng zTBJ4S?I0<$OeVOmZr$^;DQctFKP4Vku6{G3v6+^nRMnn&WDrdhqH1hDK`olOWX15jYj$m|$Q&|*TRu-I^O%>7JUN)S#KcUfpxpW`F$wgQaZeibXT%t6$!#&bTomaW0it>kkxO&Y8wS@ zX|xQD23Utl$P8(`1Jibe^N&AZ@^53>l_cm#ybuq{!eE+0vX~&2ITdtGFX<(_rq}FO zQhZ^9&R_ZJ2_^WeEdh#{+jD0^*7Pm?ofL<^A?sw`1D((r{2d6?g}prcN#^Bi8N`JM zl&l+71U0zr#RJgB!@!6kd=XS}s)EdTboRlc4S4j}2x~d`QU|FHWM0*aY3Lf6wS&CW zHFzh_%cAvvL1BHbRH<6;N4eN!eUM5PYYi?0KNfK=A+xHo3irruDgQ5_E|ehA=y#1` zCXCSu_-4YEhdV)Ti_rAGLf%`S^Sl&IhHZwNUo~;IZR&C^%7k-cMe`4#?!g=C2*XDh zKE;3@-wWst|}ue literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/__pycache__/lru.cpython-36.pyc b/venv/lib/python3.6/site-packages/cachetools/__pycache__/lru.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae4b1b9172434a2d2e8592ffa27973fe5343c789 GIT binary patch literal 1949 zcma)7TaOzx6t+E+WOCi?Qmqh|Y90V}q&BOT6%S~sDiwr)YLT|8Xd{F>9XoW=xz%>6 zCQ4t({u$o+HGV?kseged&T%r?bhQE;*>gPSjQySOT=IFp-`V?f@be!HLjEEXE)z7XhX=wvn0g9}Bx5QFTt&y8*vAXc>DZTzX>&r|g>>A6 zT?=+C5rD1*y8w1=(Scncx}tYZ#%s_{8bJegMJ}K-S^8fLn)$Dm;DzPz^y=`>@m~^%~_B@HQIGuYvi7#@@T& zwkBI9k;N^Ohp?%c1pXY8UqSJ0cvNlBN1kKO0jn_ynIUsmVA^On#~^JmT_S92l3<16 zU@$Qi9AV#sFh4NFKu%BD3L^W4{zQsTd}6#89rXnz_%pshJyhu-S<&C<6H*KxBgtgi z!fcp8b8t21E$*JlynH3YxDcU|W~PeJKz%*E0jY2^bg_?~hE<%ZFmpAj>YAKEO^z1b zPj#5;Q0A4HpGJZ83;Ehu9|%y6AlrXv%IZ7Vx=OXd4|4vEQl+wONQx}h8cGg|uZVLA zl2?^g#4b3!OkxZ4NG?{k#+)UL(F3TDL$(-h^KN5gyXYD>C6|RrkVhQv@QJN;KE&8U zmvD6gY+eU88L&B8vne*QKOw*)d%Vp6&pD_*h9eXP^xtrUhwD=N3=DMu3!#h-FBkUO z=4z;4!Z-873#ce9=?U2ZeEh!ve+UQt7hrWAjBdi*Vm$<`*e?ePi`I5H&r31OFlar_ zU(Vue6T%kfqD(k?!r44{4)}? z(0EWleb(^@je$S#gLaR0nob`z5z}M_DGZntM%f*08?K+Nf#5+`-C%>0wKsRM>RdDH Jv4Hiwe*o*8r-%Rm literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/__pycache__/rr.cpython-36.pyc b/venv/lib/python3.6/site-packages/cachetools/__pycache__/rr.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6fe061441eec1c8708cec743b3c19ee0e447a15 GIT binary patch literal 1281 zcmZuwON$&g5SG->8PCoR1{+@jIwY`dytDX$PsSKbFiBt!6GM_FpzUpGygl2mRjZ9> z7+*5`XYz+~&?%6U|3XfwQqP*TiJ(-aM^}};@9U=r2jj!Pr@#N@5%LeYHGGI)fpsrn zl0?#yR5Ya&V^*@1Nl*HvSNW+Adw~qENgBK%GLrE%k+Jf3UK&dFGf76DAOlILJ2%%>axBOrAlYNJ=FE9BAq(e-%i!beLSzG*r=m$d0DLfJhn-SlDQ>aIf7QFWe*e zLbYXa=TWj{hONBISaaiV zi3sX&%g{?QpciWV*v3K>bzy|i0W5Wh6Ta8Z#J)kXMGtGqbmE*6&vL)+tE8^ zaMdgw>cfQS=?P3TunyTEbjrpwW}DeQ?fj~lKa;%?IkSQg`lW@8M`tO52|DeB-diE;;F32j}(j8sG58#ORHYW>J zHSZM%*11-u*EP@hAY^`abg9;l`1`EvRdUALtkCn#o$oqcbX--fS)V46d!hBqqBC~< zLoL;Z@3n5Ujek<>AsPW?W!7~<3yj{c4JE%GOMnx?ym0oJ-*-f z`&I3WtE<7e|P3RRp*WA{WoA!n$oVSH8pyM$=5!+IQnof09ID zcQ78wWcy1~KX9+NJNKdvhvmOQyi2$f87)&75UB=nR)r@j56qS$d{KR1v|JI06`Vcc zVzPSbhBv#z-PGQV_ERs~8+T=tI>Tr$Nu9BbKHcuv*&IAuIIiP}*U`+(nGqT@3oWL@ z$IR`fB|SWm6*Nsdb>gVMQ{MTbAy@F=zb{=&2IFhv?)b{xNw+Vq4CD*X-)~3aT8DZi zqftLz?j}k9>Ucl(!>~K-CSkaWZ^TsCFgot#vDX5@NZhv^61A+r&LQ8-)dUh+sz7X zIcyK04pkeB#H7!DEe!8Z+WqWFH4NkaD2bsvEiUV9*4UKRQ9YVS*^$yKiG0hk0>{_Z z?ci?lqvc-55pSU>aB2z*h*Y72v!jCsNL9fCq^clkRm6&@;khqX6>`1sPInN=j`9XR z$1{(@;~JoXFx3FHwxtRoD_zy^hGD`_q-*)*Fp87z@Dt#eI7nUfcu8TUE6wo~juM2~ z`;SIpAyW3F)pb_Yl%V*1D_`Ezy5o)<;6y-7aggZO!em@MKp;U}O z!wgK{nwE0u=LJA16G5tM^#VEssFLfHmdnAN(3+b=kMa?^4o6t8z{CKr32AL@P08;7 zw1vp>1aD*(bd&{4#He@zw4z}W$uPWtp)pNOf!8h1tTU|c&?zuxHs~u-zsa{Y&}34X zuPUi>8!CZJB~UJg9qn}vxsgE-?U7Kf@pH5YV!E`Lepbv);1r&u7Mf3X%$!Rs$%s@= zd$gNW1ku*{Tt^B;3j$G6WHS~1DQBCRi;TIfwDL)mw39^Y8FOSO5{B8>F#Oii z{2Rsm#pCT}Rg&8!c}~*AI`~hr_aqwvUvoi&z0$KK7tjtI8&h!K@*UsvecuKj@JR

OCngEG+qN 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 A_y7O^ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/cachetools/abc.py b/venv/lib/python3.6/site-packages/cachetools/abc.py new file mode 100644 index 0000000..b663d96 --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/abc.py @@ -0,0 +1,48 @@ +from __future__ import absolute_import + +import collections +from abc import abstractmethod + + +class DefaultMapping(collections.MutableMapping): + + __slots__ = () + + @abstractmethod + def __contains__(self, key): # pragma: nocover + return False + + @abstractmethod + def __getitem__(self, key): # pragma: nocover + if hasattr(self.__class__, '__missing__'): + return self.__class__.__missing__(self, key) + else: + raise KeyError(key) + + def get(self, key, default=None): + if key in self: + return self[key] + else: + return default + + __marker = object() + + def pop(self, key, default=__marker): + if key in self: + value = self[key] + del self[key] + elif default is self.__marker: + raise KeyError(key) + else: + value = default + return value + + def setdefault(self, key, default=None): + if key in self: + value = self[key] + else: + self[key] = value = default + return value + + +DefaultMapping.register(dict) diff --git a/venv/lib/python3.6/site-packages/cachetools/cache.py b/venv/lib/python3.6/site-packages/cachetools/cache.py new file mode 100644 index 0000000..5cb8071 --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/cache.py @@ -0,0 +1,91 @@ +from __future__ import absolute_import + +from .abc import DefaultMapping + + +class _DefaultSize(object): + def __getitem__(self, _): + return 1 + + def __setitem__(self, _, value): + assert value == 1 + + def pop(self, _): + return 1 + + +class Cache(DefaultMapping): + """Mutable mapping to serve as a simple cache or cache base class.""" + + __size = _DefaultSize() + + def __init__(self, maxsize, getsizeof=None): + if getsizeof: + self.getsizeof = getsizeof + if self.getsizeof is not Cache.getsizeof: + self.__size = dict() + self.__data = dict() + self.__currsize = 0 + self.__maxsize = maxsize + + def __repr__(self): + return '%s(%r, maxsize=%r, currsize=%r)' % ( + self.__class__.__name__, + list(self.__data.items()), + self.__maxsize, + self.__currsize, + ) + + def __getitem__(self, key): + try: + return self.__data[key] + except KeyError: + return self.__missing__(key) + + def __setitem__(self, key, value): + maxsize = self.__maxsize + size = self.getsizeof(value) + if size > maxsize: + raise ValueError('value too large') + if key not in self.__data or self.__size[key] < size: + while self.__currsize + size > maxsize: + self.popitem() + if key in self.__data: + diffsize = size - self.__size[key] + else: + diffsize = size + self.__data[key] = value + self.__size[key] = size + self.__currsize += diffsize + + def __delitem__(self, key): + size = self.__size.pop(key) + del self.__data[key] + self.__currsize -= size + + def __contains__(self, key): + return key in self.__data + + def __missing__(self, key): + raise KeyError(key) + + def __iter__(self): + return iter(self.__data) + + def __len__(self): + return len(self.__data) + + @property + def maxsize(self): + """The maximum size of the cache.""" + return self.__maxsize + + @property + def currsize(self): + """The current size of the cache.""" + return self.__currsize + + @staticmethod + def getsizeof(value): + """Return the size of a cache element's value.""" + return 1 diff --git a/venv/lib/python3.6/site-packages/cachetools/func.py b/venv/lib/python3.6/site-packages/cachetools/func.py new file mode 100644 index 0000000..1b0b856 --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/func.py @@ -0,0 +1,136 @@ +"""`functools.lru_cache` compatible memoizing function decorators.""" + +from __future__ import absolute_import + +import collections +import functools +import random +import time + +try: + from threading import RLock +except ImportError: # pragma: no cover + from dummy_threading import RLock + +from . import keys +from .lfu import LFUCache +from .lru import LRUCache +from .rr import RRCache +from .ttl import TTLCache + +__all__ = ('lfu_cache', 'lru_cache', 'rr_cache', 'ttl_cache') + + +_CacheInfo = collections.namedtuple('CacheInfo', [ + 'hits', 'misses', 'maxsize', 'currsize' +]) + + +class _UnboundCache(dict): + + maxsize = None + + @property + def currsize(self): + return len(self) + + +class _UnboundTTLCache(TTLCache): + def __init__(self, ttl, timer): + TTLCache.__init__(self, float('inf'), ttl, timer) + + @property + def maxsize(self): + return None + + +def _cache(cache, typed=False): + def decorator(func): + key = keys.typedkey if typed else keys.hashkey + lock = RLock() + stats = [0, 0] + + def cache_info(): + with lock: + hits, misses = stats + maxsize = cache.maxsize + currsize = cache.currsize + return _CacheInfo(hits, misses, maxsize, currsize) + + def cache_clear(): + with lock: + try: + cache.clear() + finally: + stats[:] = [0, 0] + + def wrapper(*args, **kwargs): + k = key(*args, **kwargs) + with lock: + try: + v = cache[k] + stats[0] += 1 + return v + except KeyError: + stats[1] += 1 + v = func(*args, **kwargs) + try: + with lock: + cache[k] = v + except ValueError: + pass # value too large + return v + functools.update_wrapper(wrapper, func) + if not hasattr(wrapper, '__wrapped__'): + wrapper.__wrapped__ = func # Python 2.7 + wrapper.cache_info = cache_info + wrapper.cache_clear = cache_clear + return wrapper + return decorator + + +def lfu_cache(maxsize=128, typed=False): + """Decorator to wrap a function with a memoizing callable that saves + up to `maxsize` results based on a Least Frequently Used (LFU) + algorithm. + + """ + if maxsize is None: + return _cache(_UnboundCache(), typed) + else: + return _cache(LFUCache(maxsize), typed) + + +def lru_cache(maxsize=128, typed=False): + """Decorator to wrap a function with a memoizing callable that saves + up to `maxsize` results based on a Least Recently Used (LRU) + algorithm. + + """ + if maxsize is None: + return _cache(_UnboundCache(), typed) + else: + return _cache(LRUCache(maxsize), typed) + + +def rr_cache(maxsize=128, choice=random.choice, typed=False): + """Decorator to wrap a function with a memoizing callable that saves + up to `maxsize` results based on a Random Replacement (RR) + algorithm. + + """ + if maxsize is None: + return _cache(_UnboundCache(), typed) + else: + return _cache(RRCache(maxsize, choice), typed) + + +def ttl_cache(maxsize=128, ttl=600, timer=time.time, typed=False): + """Decorator to wrap a function with a memoizing callable that saves + up to `maxsize` results based on a Least Recently Used (LRU) + algorithm with a per-item time-to-live (TTL) value. + """ + if maxsize is None: + return _cache(_UnboundTTLCache(ttl, timer), typed) + else: + return _cache(TTLCache(maxsize, ttl, timer), typed) diff --git a/venv/lib/python3.6/site-packages/cachetools/keys.py b/venv/lib/python3.6/site-packages/cachetools/keys.py new file mode 100644 index 0000000..adb9dad --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/keys.py @@ -0,0 +1,43 @@ +"""Key functions for memoizing decorators.""" + +from __future__ import absolute_import + +__all__ = ('hashkey', 'typedkey') + + +class _HashedTuple(tuple): + + __hashvalue = None + + def __hash__(self, hash=tuple.__hash__): + hashvalue = self.__hashvalue + if hashvalue is None: + self.__hashvalue = hashvalue = hash(self) + return hashvalue + + def __add__(self, other, add=tuple.__add__): + return _HashedTuple(add(self, other)) + + def __radd__(self, other, add=tuple.__add__): + return _HashedTuple(add(other, self)) + + +_kwmark = (object(),) + + +def hashkey(*args, **kwargs): + """Return a cache key for the specified hashable arguments.""" + + if kwargs: + return _HashedTuple(args + sum(sorted(kwargs.items()), _kwmark)) + else: + return _HashedTuple(args) + + +def typedkey(*args, **kwargs): + """Return a typed cache key for the specified hashable arguments.""" + + key = hashkey(*args, **kwargs) + key += tuple(type(v) for v in args) + key += tuple(type(v) for _, v in sorted(kwargs.items())) + return key diff --git a/venv/lib/python3.6/site-packages/cachetools/lfu.py b/venv/lib/python3.6/site-packages/cachetools/lfu.py new file mode 100644 index 0000000..4857c4e --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/lfu.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +import collections + +from .cache import Cache + + +class LFUCache(Cache): + """Least Frequently Used (LFU) cache implementation.""" + + def __init__(self, maxsize, getsizeof=None): + Cache.__init__(self, maxsize, getsizeof) + self.__counter = collections.Counter() + + def __getitem__(self, key, cache_getitem=Cache.__getitem__): + value = cache_getitem(self, key) + self.__counter[key] -= 1 + return value + + def __setitem__(self, key, value, cache_setitem=Cache.__setitem__): + cache_setitem(self, key, value) + self.__counter[key] -= 1 + + def __delitem__(self, key, cache_delitem=Cache.__delitem__): + cache_delitem(self, key) + del self.__counter[key] + + def popitem(self): + """Remove and return the `(key, value)` pair least frequently used.""" + try: + (key, _), = self.__counter.most_common(1) + except ValueError: + raise KeyError('%s is empty' % self.__class__.__name__) + else: + return (key, self.pop(key)) diff --git a/venv/lib/python3.6/site-packages/cachetools/lru.py b/venv/lib/python3.6/site-packages/cachetools/lru.py new file mode 100644 index 0000000..44ec4f1 --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/lru.py @@ -0,0 +1,48 @@ +from __future__ import absolute_import + +import collections + +from .cache import Cache + + +class LRUCache(Cache): + """Least Recently Used (LRU) cache implementation.""" + + def __init__(self, maxsize, getsizeof=None): + Cache.__init__(self, maxsize, getsizeof) + self.__order = collections.OrderedDict() + + def __getitem__(self, key, cache_getitem=Cache.__getitem__): + value = cache_getitem(self, key) + self.__update(key) + return value + + def __setitem__(self, key, value, cache_setitem=Cache.__setitem__): + cache_setitem(self, key, value) + self.__update(key) + + def __delitem__(self, key, cache_delitem=Cache.__delitem__): + cache_delitem(self, key) + del self.__order[key] + + def popitem(self): + """Remove and return the `(key, value)` pair least recently used.""" + try: + key = next(iter(self.__order)) + except StopIteration: + raise KeyError('%s is empty' % self.__class__.__name__) + else: + return (key, self.pop(key)) + + if hasattr(collections.OrderedDict, 'move_to_end'): + def __update(self, key): + try: + self.__order.move_to_end(key) + except KeyError: + self.__order[key] = None + else: + def __update(self, key): + try: + self.__order[key] = self.__order.pop(key) + except KeyError: + self.__order[key] = None diff --git a/venv/lib/python3.6/site-packages/cachetools/rr.py b/venv/lib/python3.6/site-packages/cachetools/rr.py new file mode 100644 index 0000000..09ff770 --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/rr.py @@ -0,0 +1,36 @@ +from __future__ import absolute_import + +import random + +from .cache import Cache + + +# random.choice cannot be pickled in Python 2.7 +def _choice(seq): + return random.choice(seq) + + +class RRCache(Cache): + """Random Replacement (RR) cache implementation.""" + + def __init__(self, maxsize, choice=random.choice, getsizeof=None): + Cache.__init__(self, maxsize, getsizeof) + # TODO: use None as default, assing to self.choice directly? + if choice is random.choice: + self.__choice = _choice + else: + self.__choice = choice + + @property + def choice(self): + """The `choice` function used by the cache.""" + return self.__choice + + def popitem(self): + """Remove and return a random `(key, value)` pair.""" + try: + key = self.__choice(list(self)) + except IndexError: + raise KeyError('%s is empty' % self.__class__.__name__) + else: + return (key, self.pop(key)) diff --git a/venv/lib/python3.6/site-packages/cachetools/ttl.py b/venv/lib/python3.6/site-packages/cachetools/ttl.py new file mode 100644 index 0000000..6884045 --- /dev/null +++ b/venv/lib/python3.6/site-packages/cachetools/ttl.py @@ -0,0 +1,216 @@ +from __future__ import absolute_import + +import collections +import time + +from .cache import Cache + + +class _Link(object): + + __slots__ = ('key', 'expire', 'next', 'prev') + + def __init__(self, key=None, expire=None): + self.key = key + self.expire = expire + + def __reduce__(self): + return _Link, (self.key, self.expire) + + def unlink(self): + next = self.next + prev = self.prev + prev.next = next + next.prev = prev + + +class _Timer(object): + + def __init__(self, timer): + self.__timer = timer + self.__nesting = 0 + + def __call__(self): + if self.__nesting == 0: + return self.__timer() + else: + return self.__time + + def __enter__(self): + if self.__nesting == 0: + self.__time = time = self.__timer() + else: + time = self.__time + self.__nesting += 1 + return time + + def __exit__(self, *exc): + self.__nesting -= 1 + + def __reduce__(self): + return _Timer, (self.__timer,) + + def __getattr__(self, name): + return getattr(self.__timer, name) + + +class TTLCache(Cache): + """LRU Cache implementation with per-item time-to-live (TTL) value.""" + + def __init__(self, maxsize, ttl, timer=time.time, getsizeof=None): + Cache.__init__(self, maxsize, getsizeof) + self.__root = root = _Link() + root.prev = root.next = root + self.__links = collections.OrderedDict() + self.__timer = _Timer(timer) + self.__ttl = ttl + + def __contains__(self, key): + try: + link = self.__links[key] # no reordering + except KeyError: + return False + else: + return not (link.expire < self.__timer()) + + def __getitem__(self, key, cache_getitem=Cache.__getitem__): + try: + link = self.__getlink(key) + except KeyError: + expired = False + else: + expired = link.expire < self.__timer() + if expired: + return self.__missing__(key) + else: + return cache_getitem(self, key) + + def __setitem__(self, key, value, cache_setitem=Cache.__setitem__): + with self.__timer as time: + self.expire(time) + cache_setitem(self, key, value) + try: + link = self.__getlink(key) + except KeyError: + self.__links[key] = link = _Link(key) + else: + link.unlink() + link.expire = time + self.__ttl + link.next = root = self.__root + link.prev = prev = root.prev + prev.next = root.prev = link + + def __delitem__(self, key, cache_delitem=Cache.__delitem__): + cache_delitem(self, key) + link = self.__links.pop(key) + link.unlink() + if link.expire < self.__timer(): + raise KeyError(key) + + def __iter__(self): + root = self.__root + curr = root.next + while curr is not root: + # "freeze" time for iterator access + with self.__timer as time: + if not (curr.expire < time): + yield curr.key + curr = curr.next + + def __len__(self): + root = self.__root + curr = root.next + time = self.__timer() + count = len(self.__links) + while curr is not root and curr.expire < time: + count -= 1 + curr = curr.next + return count + + def __setstate__(self, state): + self.__dict__.update(state) + root = self.__root + root.prev = root.next = root + for link in sorted(self.__links.values(), key=lambda obj: obj.expire): + link.next = root + link.prev = prev = root.prev + prev.next = root.prev = link + self.expire(self.__timer()) + + def __repr__(self, cache_repr=Cache.__repr__): + with self.__timer as time: + self.expire(time) + return cache_repr(self) + + @property + def currsize(self): + with self.__timer as time: + self.expire(time) + return super(TTLCache, self).currsize + + @property + def timer(self): + """The timer function used by the cache.""" + return self.__timer + + @property + def ttl(self): + """The time-to-live value of the cache's items.""" + return self.__ttl + + def expire(self, time=None): + """Remove expired items from the cache.""" + if time is None: + time = self.__timer() + root = self.__root + curr = root.next + links = self.__links + cache_delitem = Cache.__delitem__ + while curr is not root and curr.expire < time: + cache_delitem(self, curr.key) + del links[curr.key] + next = curr.next + curr.unlink() + curr = next + + def clear(self): + with self.__timer as time: + self.expire(time) + Cache.clear(self) + + def get(self, *args, **kwargs): + with self.__timer: + return Cache.get(self, *args, **kwargs) + + def pop(self, *args, **kwargs): + with self.__timer: + return Cache.pop(self, *args, **kwargs) + + def setdefault(self, *args, **kwargs): + with self.__timer: + return Cache.setdefault(self, *args, **kwargs) + + def popitem(self): + """Remove and return the `(key, value)` pair least recently used that + has not already expired. + + """ + with self.__timer as time: + self.expire(time) + try: + key = next(iter(self.__links)) + except StopIteration: + raise KeyError('%s is empty' % self.__class__.__name__) + else: + return (key, self.pop(key)) + + if hasattr(collections.OrderedDict, 'move_to_end'): + def __getlink(self, key): + value = self.__links[key] + self.__links.move_to_end(key) + return value + else: + def __getlink(self, key): + value = self.__links.pop(key) + self.__links[key] = value + return value diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/DESCRIPTION.rst b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..d584ce6 --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/DESCRIPTION.rst @@ -0,0 +1,45 @@ +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/LICENSE.txt b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/LICENSE.txt new file mode 100644 index 0000000..802b53f --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/LICENSE.txt @@ -0,0 +1,21 @@ +This packge contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011# +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1# +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/METADATA b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/METADATA new file mode 100644 index 0000000..165ee1a --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/METADATA @@ -0,0 +1,69 @@ +Metadata-Version: 2.0 +Name: certifi +Version: 2018.11.29 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/RECORD b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/RECORD new file mode 100644 index 0000000..c682542 --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/RECORD @@ -0,0 +1,15 @@ +certifi/__init__.py,sha256=timLpLv3BNcGLLEz2s6gyA34hOhMb4AIPBz0zxOxna8,52 +certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 +certifi/cacert.pem,sha256=zGy4Y1gu9Zy-6CGvg3apdC7kXMm3f1ELolJwNDnBRv0,275834 +certifi/core.py,sha256=K_VfM6GwSemTFisUgFWyk__w1m9pCGFRF5zTzO5bGv0,288 +certifi-2018.11.29.dist-info/DESCRIPTION.rst,sha256=zHkn1YEe408K2MGitHvHNrp17zRLM4tUVRv_8PJTRKc,1465 +certifi-2018.11.29.dist-info/LICENSE.txt,sha256=anCkv2sBABbVmmS4rkrY3H9e8W8ftFPMLs13HFo0ETE,1048 +certifi-2018.11.29.dist-info/METADATA,sha256=NPNIqL3Rn7OYSxKd9-eM_IG52qaoEYXzbLPQYAc7iEo,2408 +certifi-2018.11.29.dist-info/RECORD,, +certifi-2018.11.29.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +certifi-2018.11.29.dist-info/metadata.json,sha256=qQMHCg3rKC0sNjQVdrpaQSXFC6azUQcgV1bA1PB1mLM,1049 +certifi-2018.11.29.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi-2018.11.29.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi/__pycache__/__init__.cpython-36.pyc,, +certifi/__pycache__/core.cpython-36.pyc,, +certifi/__pycache__/__main__.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/WHEEL b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/metadata.json b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/metadata.json new file mode 100644 index 0000000..aff1843 --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MPL-2.0", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2018.11.29"} \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi-2018.11.29.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/venv/lib/python3.6/site-packages/certifi/__init__.py b/venv/lib/python3.6/site-packages/certifi/__init__.py new file mode 100644 index 0000000..ef71f3a --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2018.11.29" diff --git a/venv/lib/python3.6/site-packages/certifi/__main__.py b/venv/lib/python3.6/site-packages/certifi/__main__.py new file mode 100644 index 0000000..5f1da0d --- /dev/null +++ b/venv/lib/python3.6/site-packages/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/venv/lib/python3.6/site-packages/certifi/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/certifi/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2efdfab90e581a9e8f73feffb7b4a5ec5da58bb0 GIT binary patch literal 199 zcmXr!<>lgkz!zh}z`*brh~a<<$Z`PUVi6#b!jQt4!;s4u#mLBz!W6}n!W_(?$?}pB zD5c4Gi?uu>wJ5cU%gDgcLeJ1p&&bkGllc})a(+>25y+TZ-0|^csYS(^`FZj2D;bJd zfns3dm$80HZh?M5W`S-}X=YA}Zf=p0VPRrwihgoxQAuW6CY+9s&&lgkz!#&*z`*brh~a<<$Z`PUVksbz!jQt4!;s4u#mLBz%9P63%+L&Er7#6E zXfnS9$}?y(-eN7!NG(eB(`3HIo}5}#l9`rS1Ty0mYe7+FUdc*^B32*|O#Cv|FUc*? zFUTy=O)AaINzu(MGBPYoOij^;YJ}7A@wthadGYaj1(mlrY;yBcN^?@}7=h*#gN){3 F1OR9=E(`zw literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/certifi/__pycache__/core.cpython-36.pyc b/venv/lib/python3.6/site-packages/certifi/__pycache__/core.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245dee270ee2772b48b2b5fe67e74d669b67684f GIT binary patch literal 460 zcmYk2K}*9h6vvY^-D+@p_tcXxVJqrYMDV_gdMQGvO-eJ{rY0HUP%rh%_?3DRJoyzo z`LfBj2k-x02>jpgz4OtC9ey3$#~7h+v=apSD@c0+B2bD17No){7J;B2C?zrw;Uh7} zl1kE{4r3(94H^%YcPy92sX|TL7xumh#%@bx<64VFC1WGq!ZbE^rHoZ$T~<|@Q@V*O zov#~R#ChhOrmd`}><2K=EcfaIa8Uqx4QY=+9Gc@faY2XQ);)a%`_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/INSTALLER b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/METADATA b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/METADATA new file mode 100644 index 0000000..1427867 --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/METADATA @@ -0,0 +1,96 @@ +Metadata-Version: 2.0 +Name: chardet +Version: 3.0.4 +Summary: Universal encoding detector for Python 2 and 3 +Home-page: https://github.com/chardet/chardet +Author: Daniel Blanchard +Author-email: dan.blanchard@gmail.com +License: LGPL +Keywords: encoding,i18n,xml +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Linguistic + +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/RECORD b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/RECORD new file mode 100644 index 0000000..b833882 --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/RECORD @@ -0,0 +1,91 @@ +chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +chardet/cli/chardetect.py,sha256=YBO8L4mXo0WR6_-Fjh_8QxPBoEBNqB9oNxNrdc54AQs,2738 +chardet-3.0.4.dist-info/DESCRIPTION.rst,sha256=PQ4sBsMyKFZkjC6QpmbpLn0UtCNyeb-ZqvCGEgyZMGk,2174 +chardet-3.0.4.dist-info/METADATA,sha256=RV_2I4B1Z586DL8oVO5Kp7X5bUdQ5EuKAvNoAEF8wSw,3239 +chardet-3.0.4.dist-info/RECORD,, +chardet-3.0.4.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +chardet-3.0.4.dist-info/entry_points.txt,sha256=fAMmhu5eJ-zAJ-smfqQwRClQ3-nozOCmvJ6-E8lgGJo,60 +chardet-3.0.4.dist-info/metadata.json,sha256=0htbRM18ujyGZDdfowgAqj6Hq2eQtwzwyhaEveKntgo,1375 +chardet-3.0.4.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 +../../../bin/chardetect,sha256=hcAzrlo5Bhx675drkesQoDsRBlBb1vzxwEvYbWz7Cqg,249 +chardet-3.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +chardet/cli/__pycache__/__init__.cpython-36.pyc,, +chardet/cli/__pycache__/chardetect.cpython-36.pyc,, +chardet/__pycache__/charsetprober.cpython-36.pyc,, +chardet/__pycache__/euckrfreq.cpython-36.pyc,, +chardet/__pycache__/codingstatemachine.cpython-36.pyc,, +chardet/__pycache__/mbcsgroupprober.cpython-36.pyc,, +chardet/__pycache__/langhebrewmodel.cpython-36.pyc,, +chardet/__pycache__/euctwfreq.cpython-36.pyc,, +chardet/__pycache__/langcyrillicmodel.cpython-36.pyc,, +chardet/__pycache__/sbcharsetprober.cpython-36.pyc,, +chardet/__pycache__/jpcntx.cpython-36.pyc,, +chardet/__pycache__/__init__.cpython-36.pyc,, +chardet/__pycache__/charsetgroupprober.cpython-36.pyc,, +chardet/__pycache__/version.cpython-36.pyc,, +chardet/__pycache__/big5freq.cpython-36.pyc,, +chardet/__pycache__/langthaimodel.cpython-36.pyc,, +chardet/__pycache__/hebrewprober.cpython-36.pyc,, +chardet/__pycache__/sjisprober.cpython-36.pyc,, +chardet/__pycache__/jisfreq.cpython-36.pyc,, +chardet/__pycache__/gb2312freq.cpython-36.pyc,, +chardet/__pycache__/big5prober.cpython-36.pyc,, +chardet/__pycache__/mbcharsetprober.cpython-36.pyc,, +chardet/__pycache__/universaldetector.cpython-36.pyc,, +chardet/__pycache__/chardistribution.cpython-36.pyc,, +chardet/__pycache__/euctwprober.cpython-36.pyc,, +chardet/__pycache__/euckrprober.cpython-36.pyc,, +chardet/__pycache__/mbcssm.cpython-36.pyc,, +chardet/__pycache__/utf8prober.cpython-36.pyc,, +chardet/__pycache__/escprober.cpython-36.pyc,, +chardet/__pycache__/eucjpprober.cpython-36.pyc,, +chardet/__pycache__/cp949prober.cpython-36.pyc,, +chardet/__pycache__/langgreekmodel.cpython-36.pyc,, +chardet/__pycache__/sbcsgroupprober.cpython-36.pyc,, +chardet/__pycache__/langhungarianmodel.cpython-36.pyc,, +chardet/__pycache__/langbulgarianmodel.cpython-36.pyc,, +chardet/__pycache__/langturkishmodel.cpython-36.pyc,, +chardet/__pycache__/gb2312prober.cpython-36.pyc,, +chardet/__pycache__/compat.cpython-36.pyc,, +chardet/__pycache__/latin1prober.cpython-36.pyc,, +chardet/__pycache__/enums.cpython-36.pyc,, +chardet/__pycache__/escsm.cpython-36.pyc,, diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/WHEEL b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..a884269 --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +chardetect = chardet.cli.chardetect:main + diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/metadata.json b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/metadata.json new file mode 100644 index 0000000..8cdf025 --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Linguistic"], "extensions": {"python.commands": {"wrap_console": {"chardetect": "chardet.cli.chardetect:main"}}, "python.details": {"contacts": [{"email": "dan.blanchard@gmail.com", "name": "Daniel Blanchard", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/chardet/chardet"}}, "python.exports": {"console_scripts": {"chardetect": "chardet.cli.chardetect:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["encoding", "i18n", "xml"], "license": "LGPL", "metadata_version": "2.0", "name": "chardet", "summary": "Universal encoding detector for Python 2 and 3", "test_requires": [{"requires": ["hypothesis", "pytest"]}], "version": "3.0.4"} \ No newline at end of file diff --git a/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/top_level.txt b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/top_level.txt new file mode 100644 index 0000000..79236f2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet-3.0.4.dist-info/top_level.txt @@ -0,0 +1 @@ +chardet diff --git a/venv/lib/python3.6/site-packages/chardet/__init__.py b/venv/lib/python3.6/site-packages/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55fcc543588b553e3d33bdd287dbdbf6419b98f6 GIT binary patch literal 786 zcmYjP&u`N(6t?rbfsGapaP*N%tQ{){R3U@}mEbZE8%RV*Ng8`ysyNOZ7p1Q!M?TaJb-$x1pxz1U`+qRd`)W^E_q0GN9S*OJ- zrdXzg1i-C0Hfy;k<5>G2C+|<*ygkkg+YIBzf%y_<{ThNoE2Qwost=pYg6yHPDV{sZ zU7-y&&o^8K3Y%(;l(#`^yux$e)EGe)Y!EoKu6~3BMr(zrb4FO137VHPBF>t625w6- zT`ERuC1GO_Hk5Id%9J-7F>H*D3^@gX7RoLbpu~t0gk7dQFWI1_sb$q-{n(mx}#6(IVwRa{YPnC9zJ88~ZJ7?jrAnG6kTwL}TkJY$=cIM)Z(B&Z1_~{W8j;52jd0g!1kbpji-J8jpQ#PD Ji*Mtu{ST)l*mwW{ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/big5freq.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/big5freq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edbae173fc6e7686f110a7dddbb46328678d67bf GIT binary patch literal 54673 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 AN&o-= literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/chardistribution.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/chardistribution.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b7058b44d95ee3794b5a6871b5b1800ee81adb4 GIT binary patch literal 6258 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 K(?L~U75@NBOVZi^ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/charsetprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/charsetprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..978ee40ba770dd9ba3db400a4adec5ccfab08e7b GIT binary patch literal 3395 zcmai1TW=f36`s9{qAA&tW2bS{cF-hf*hF&E07YXsN*viq92ja~sR%&VT`hNpyYI9di+#+5E4(L6c+x#}TAr}> zS<`=tU2N~Eg}P}Kjn7opj??bG4z-MEYE~R{KERi!s3Zex*0P1wa>OO!2=|HA0(0R% zVJ%PkVnx)Ruv4qGB34Bmv>IsVM8nWl#hO?LtuD`r^WuV`HPC-SY?%HU`WMBEroS$1 zD0#V9+wFyFUusfMs&2=W|G&Q%+0cdxwe;=c%QsO8Hf8}ETc|BctSrtYVcHEkaiXOvR+6mSg#(J!uGDwX2dx$aY1o%RQ1~<}RnsoqTqYgmL(o5& zYM}Y<4_9@6aCHz5w%Wru5nFxrySI-+DXvCPT}Zvq=28!gDcge)@sHD32f?pNdE&_| zAHS2!3s!H>mPK?}RH&_tCM7gGA|vgYk&dEcD^_pbI=HoaaC`4#n(J1<5lbA;-Y*rzaX3xFdnBMoC-A@pCh6{zJL(p&#RRr`{c@^q_fKwj`;Zk zZDUj6w1=H%4RbqEigzk$*2%`AG@4#+7M;bI9Zf^V`cdzhVETO}#eUX%W`4OC<2^#7 zz1IZ;Q+~{i>xj)D%F<3OWE#n9*f2Y?%|+7|7cNLAq2}y1(4oK)$QEOE>P%oVbaD3b z8fMF5OY-N)bz+(Y1|^W~XdoY3m5-2m0C*`_ZRk`zE{p;lvqRN6y$m*7N^vzl;QA zF^pD(O{0lBc8}as)?n(hu`ApMXoUwV?Ll_1*zwOkN5+8dwc)#fK%Gy^=aLKAiBrjS zPf66Hfy{Z<;bdQaty&i*gI?H{`WlyMH;MBepHXstFWfr0vDLa?Esj&5sMmWIhS zzA)qjfH1-WZ2ZsTt^fXezONsu2U0=A7gCLM54noVB$xc&UrGtn<&~U+o&@v3P;)?| zBNdOrl()&0Y}oB-t}~8M(qWwPkmpjxrD+c{C32XZ#Qj)HQL$@}c&S0Y%@2BU&O5_2 zA|p6oUa03nbj2%?VXk=wzdpzMZGHnxNWHi_%!WDiJ04QV8}Co` zsMv){awP{z7)gPnA#>oJMDlz95)bnzj_01;u2&mNJIn>Z!@(dS7r+iOAdgf$&^dqD zi=!SF8Ba6Khj90;=?TwIYP;f>zm71S9r$nVJ>L5M{+sjR^qh$L{+^;#Yq0fLT}Jom z_bBQW^qO9=O7Rsc6^_(PpcE^JK>@7_Up~?@6~#)Nn+R)q28%_lbiEXXXFOlH)D)`; z{2Y*`&!Y9p6nhK)56s>VAu)du6+7>HxQ^_)wc$6c4a>FG?UOf_LU;+A3dfX7D;)m| zgA&KWn%KggIFJ6OaZdx!)~N+7E8voifmq?Z#0+}9u?NiBYKL~D4U9aDJ{A7NMt=op z-W+>Jj=}dPb~+DS_2t+G+P?(Ci5pN}Wd%?~&Ey9oVd5Nb0{eFUkJ(zWI$w*7P!Ioy z1X!K$U8#pE%@JZzHW*PVI6MTr4iC#%SCa6AAVul}1rc~QZl|GBF`Fd`9;Sj*-ZXh- z9;s6RQFv4IA;CP9GUeBI&McV+-;E^C0E1G2S(N^?h`8UEBF1|t8C8n4WhaBsEQ*Fo zRj}K64sxb>r38>z4xm}4X=l1OgHR=I4khD>GR6Vr8~eMrZ=bRCEo3syk$OtCG<<9v z4OkNHD}INEcaUDwx64Q4;o;mzA1S)c=GfaY2)urvt`M1UxCcnlGZL>Nybf{WB{EgN zq}gAfYWn5f$7zKhr-2T;g*#C4i^3(PiW-7pDd1k20`6g~d%^UU2ok9&)zjUd{|Xgr z_&}L!Z`c>?8Xkf*%XK#Fb$oTJ;ZXmixfFlPxYA?yyjmqq>p{@Z#4w?!Y$FJchhZ{( z*lz59^2fUeyMHx9UJDJyI_a4gWxxqRgN!(QJcWHgVLK zxKV_9ndq-kwM7-ZO3zgE&{Xsecomt4-ixYN&Tylz&&$1AkjWIj)(!+u`A iX8o*vBqMDWondVxnTKrcdTHg(&q)a7otjm%8_o|LG;3)9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/codingstatemachine.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f090b5e7304e606371d012ed68027f48fab7b3b GIT binary patch literal 2826 zcma)8%WfMt6y?n5F_vW|O{GE`$ODdPqrhM>7gZ zIdR~uoNwqq^p|E;psV~sS3Q@bu`F8+ItDo$KF+=OoO>zX+uG_}`m6U_tH;>i?99`^ z_#v9TiB2*ZWNgS}D5ETxhQlymKQh^n%{NRoRdf;!8#35s{nlITX4`KA^!=dhJ`?Fg z=W5ppr&3y~p9q78X!Z#@#fE`o!%zmph)ld;fb-zPrfkVJzFRVu8+f;6M{eRBs}0$e zTW{D&Fzm=4OkXOmJT9cp$KKe&u=oRUbU2#S~T6x4>!4H+uqa!Z({t*_edOlZq zs`#idn41aXbUM$3;h6Qn1O7u{JeUGVb;?Z?mkPl-oH8m^`cTBdqYia3w~Lb^Czlr3aJ2T?qZ`Eq+Px(fpmW$?wdzBnjl~GdP8nq#Q7W)??uy$r zB@a3tXm{_?&Rzxa05ND_TJJ-Jih~#!;>=ADIPssUvB*}H@ld4Y>2p&LK#JgpBGZyX zCBd|xThAyw}5NGmz0JbU)Ec5C5RE_I4LA@{&L@w6KG5&?Es z66d^o9sqILnMz?YC4LBx+_K71j$lE&cv+syXx4>t5i3WIor|p^Z3+3L zu5C|}dYNW(BpES#5w1SPN2ZvP3Kq#?U;%aLryv|ECLj2tX^5MT9(q%IjArkmI}VOn zf*Tio;QLTAj3d`LXu8%3&9{%)L43jj+|0Q8!foR(+>Nr8Oi=_`*-O&7F$syEK*9Q( zQZLC=UT#+FKDEnsR*c8EILnQ(azA0LOc^IhE~Y9;$`-9+rimI?t{;{StFloU+UcLn zT!y>c`b0`$(?jo54hh1s1L6tHfuCTzADIZVWz*k8CdRlQ82si{A^14V zd-S=5?mIN=n!{rm3{q{4XPHT6mhvev&w58-j_hd zPO>P1-7{`|@n3GOIro2ki!=O-Fc;%@`)59d8^4~q60R-08fm+~X*RL9>?CyK%rm+v zx=HeUF0#eF(M}Rsq)B2(e_vMS28}+V?h`s2&rC5>#vOUnXVU02mkia`XK0p6HU6Lx w#Bm(OJ+#QL^_ymcpqeV5Pitz!QG|Bw0gb)aSZb>;H6x86y0H<4nN$Tw=h1fei1SJQQm+J8`2|;Y z>mpWB=N9+E-OT6Hx^mUA5A^7iQ{H8ZuW-S)O}af-L7~1_F)~c z@uAf&8M=Dg1G=;-4Hm(gSbVpI9TmE$8ZDX+qGzEr;Cq$ZR^_Tz%W9|_Shjk-dMy$1 m?Ng}%?LqrimG)eXF1=`b7#h4h^#$g{Bjr;n{H8Q!fBFLmoJ?f^ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/cp949prober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/cp949prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23a02b5f83608b54085637c6fd8e922a882efe81 GIT binary patch literal 1069 zcmah|%Wl*#6t(jjx6DkTJOmOeSdE|^6)L1kh}X1YQKnRk*hENHCU)CYPA0XT#Z=u* zrG5*)lob*yet{MDIxS5%;3)R-b$lP^p1kb!mRElCzrF1c@{_bi0QeoeW*a6!1XU!b zF{Ow-<>h|tJM60<5983`Kt*{c?ojfPh)_i5L_{)N_%Rcm2^p|o6kH8x{b=XwX!px@ zW~|PpmCa_w`yx?ulNmT%9nC~m98PRv0cwEKECl^Ra^ zqy4STEj}6Z@#pQGPbq}>JN!#zHUUTyQ$b?yf*epmg?G+kUk1V#!8uvbI0Wo+1{__G zfW(+{r@rOj~uh$YtEFGuo$mD&-rTATJ}lhw2d&YW4Q&&|TAgFb$~g!s2i0E3!fw9C4Iv!PmUyN0zC z(1>ES5sAT{C2xKfC!u;JpI*|{G*x3m>Ikd`1cd@~uCFs`kn09}-IVv{F(!iw=u-Fi Fe*l3t{Ez?u literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/enums.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/enums.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6765700abb2fc4dbf4ffa4330a1e4a6ccda2285c GIT binary patch literal 2560 zcmbVO+iu%N5T$MuMPHJ*k1fyzdO-y=N}Im9L1A5Jo3Tt8B3(2>0gC3XB_!# z0TE+RR2yh}8ZFS`YmF9J;Z<_Bv302hsUe5be35e4j0+rB?zD6xtJ@3A3eW|>QhioeVtd}&fy?w zyow4P?b$u2*_FoQ=1~(prGC)sTTMq+ou1>j zA0Nn4v)h%`zQx|Dlj5ct;O;Gnh#1<%{yhz7N8wK_JN@Cup*4K}CdJ-k0MYZp} zE9~dhK84rWwF>808yCPrh2IEbtz&ss+q0cLY3%lnosMsNQg?cue`wtZ#mBHL0l8Y4 zIQ!uM90uVyO4tGb=e+??NRY{5kvC8JJK|7ry=LE&6|3Lx^`&lm?%M#slB{0?0B5fN zfF-?yZeN4C?PxNC>a_Y=dsP_JmPc{RWzTb#gsdAqV{tT2Q#$+Uc39$bPh|LjAhQG^ zoMUpD#&P-*>PxXDQ0I#%%>_vlV00wbHvpPr;33v8UU)}og9tpEv;bsLoNaG&mgPJV z+d#~W0BvCj!p@iC2!V}9DUX1XqeN|v^w!{aU>Q|f^@1#gvA9%bc-Z9Dh-E%_`WFj) zkK1EGYo*y2*THFAf5WMpH`cr1SbI&+{?U@gvD38=tnL%3FYm@t&jrqaXKP^`2r*&M z?I`~ew!IXiqIJazpTUENAOfdWBn_-kAgbze?;F#D2d@dTNRPgvYv`l+ z#HkyLHln8|PvJj;YOadNIg%O21FiC?yl>h-8jlu#6Mn$%q;@Hn?$++!0RjC#;n8f& literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/escprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/escprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6cbc4c731317d10fd6bee25c5d9b5a94de3f7d1 GIT binary patch literal 2551 zcma)7-ESL35Z}E!pU?K$NlhA3pz0AMBqQ2F-~k~7trE9&+c;4iC^~_b%kBEBcV}ns z42k7PNRCtq2?_DUV_$jcU%+2-PavN9#5+&S?AcC3D#V_4c5Y|(YvwmIAC$|*rQa)G zMN5SINnU6M@VB7HUjpHT(}0B3r4)HB&_dnS6|V6&5Q&8s;hu)=~{2#anp zEV-r7c5O=T5}xDcDdDD|Q{64|e2dhq=M=WD(X_nT^<+yVyK-SB?YJkJ;9wp9voYq$^@rJwND% zk~V!!8I2Ge^;wUf0+W!0PRLa2YZJ=pkAScanGmK=NZ&|uee)KPTfpo6d}1YqDV>7G z;=j1~N8J+WezTC-=VWD&O%}3BCgXV0lA_CsUQ)CQdaq0gVi}yFH35#L0D#BZ3U#%W zG#8JCLdp`{KeZU^MZJWvw2&E>#i6u8A`vP8=~y;Wze#`f;R#+^oeD>cDABH|Ja zA@fKqRJHEk-o1^wvVgzlgPpzl?WQc^&yoio{8qr;%pZ)RB)!Bkw+haDh@Ds@Y4vOh zuZwY#nk>c;N^=t2lGL=+h(*v=_k(8@81n-!jv4!v{Qcq0Bplux_J-FFM!kSv59P-D zho0a!aep{$F#K^$|&Os51pjF;jUnuc$Ti<$kRo z%doNXom@i>QXd#Qvu~;gB9bdOeHqCrkeVj1Adh-ADqlnXbtL#=wZ+H4#8n`KR^ZJB z)sz)%pySmGuU4K|JQ<&keG__Y0)guz>?pua-2n!5ygG7mZfeiG&LS@qbzH1MOdDUl zaNvuY|L7Z5k?4Knu_n6!Nu2@w4AReW?IXZ6LrCVh{+P<2 z6SJQOXj(8+Xc5=}*A-!16(l7k(fjrk6H^&>ufVu8*L_3|%|~cASXncgcO>HGIdrHP z3Z3#Q@M$p;M@bg;5&@Ow>U(=Tdl{8HPrQ$ZVAdf*JPmbj^e2s(TO(fTWq~%$5^hFTBvPA&SlYokUtO0L9k1-KiIYX-~ z+a=qu4a-zHrdg|` fsx)MoY;n1>)RbDEWS008FB)TsvBAbGbj|n&!=7HG literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/escsm.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/escsm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0a7ecf08da3545f696cb655b66315161872d659 GIT binary patch literal 7308 zcmeHLTTdE66yD{s+(GbC+gf9qKDbS&imy$hQc_ev13XQdkd+zK29WN;L;G9$2l|hi zd1}%p{z9KRXZDV(21RKrY<70eoO8Z&*_pG$Y$p=Y)X(I{q$~)(1m{l_gdIj}Km3A# z1uV9Oj)+82z>CO7#7};92e4%HfZ`)C>Tw6znAdH}a(%30@-Z9&6bzR>YP8tzrVU)K z&-$)sYZFO$35AG{p-Ci!!#IMY-y{^qPf!G;x&L6#rRShc|E_y_#Wgx+>FeGz3)Tqh zgS3-|sCoRO;~w-ST@M++Hs$=S9TdgOC`KYUMxrE!<3?8E_$f*-$(ysn-^CSnTyYq7 zN3-EYTYA{)fd$We>De(OGM_Fzhj*qmC;uiLkTqra+-Mb15ryu2z6i>fF=ly4;oemgrUTmuhAmPe%Q2w=L+U*g8} z6Y-yV04qkHVX$meSS&ipU;L~w7UC=s51a^Dy1wq|Mbe(GQ(c~uDU$HXxIXCn=Gw(z zs_Fc9jPv<7YmD#4ED;Z!2stuVMVMsGwBPkDSL;|cGwo3tr&TUtQ?IApE|(c=Y$O|V zz~DQp5ys;s?U^&{J#f9yxA%`b?Q(Rin#qMHSvc>!@W(2gR~AXTcHP;bTLR3g;+VVr z$GvW6wTtZ}ra1*}`bRD=(je&$I+_Y+uT(0cM!r;|!CHN{TBpH6wR*(PIQQ$dM!7(P zj9aVIGzb-UtBq2j(x~t5l?pTloN}Xl^uAD{33j9kC#v}h$BNq|Q(m^I5sZw@xde4^ z?1EyX0}7aKcT6ad8};h2>VjgV0}7blP#|YOeHYZ%utS9A_vS{w)7$8s_p&F0^ES?Q z)ZEr*h2RZ1e8!}2J&D%TI&XSkX!vdC0uS2c-3rs!dhE*(_p`&}J6wUls<CzyAPK=6mk| literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/eucjpprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/eucjpprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5087ae87968313596db8836f079461839b9e6e1 GIT binary patch literal 2355 zcmai0NpB-X6t1dX+;(ioli89HLP27XjF^Q*BMu|P;Fwu7aiZ8GL<>}OTotE1-EF73 zEG3rb4P8q+iI@7JZ)rCvr9l{2+Dpo5C9GK5Pu9|E zSf%7K5hW3v6A?&v?u0c_?viHZ4FxexW~%#YbQouYu8y=c)!nFn9B0zbn$+Cbog_N` z;!MldaiqFZ<8G;7Wur9`7snQdfV6e%=SgmOp1f<@-QL5>i1z_L>|~K?OSxLdVjMaDjHECp_VwlQ|82 zpzW)HE{U?JoRcsRYoZEc`89D#SOFAjX3fejUe!lP@P{J`#+H8qohF*j$eaz?92T{s z-8sy;r~NsBv7`e#mS<#G!5xCY<+RgWGhRL!OQp(ii3vE5vsiPkJeaBgdF8%^k>{!M zaeiH_V8Z1=&A}Q|m!Inbm8Xn6%XLhH0b1Nf$e{R*t^UcBX> zL3;}hUIq=IaSHe@z;PAcZ=q4^NI^sZYN}BTSCF-V-Bs*x#|O}Ij1yF9dS%6QcP$W? zbU`DwE)EC^24S744`=Q?+qd^FL=`fYf=m_B0aSSwrSd*rz@Q^+y16QEb<_WfHNmrJ z9A#ju{}LP|Q8t)F1Bo7YA@maF7aRIkBiMz0gl=Qs`2b#g`nyG)&f(i3-~RH70q$(* z%;=15L0r6YX5hR-?i&OOJ*j_1K%Tph$E>{Tpy`d5><6mu+q-Yh$%5X*5FKv4ba8(19^hOD&+t0acW&p~ z@K;2^_HnGYA?!wKJJQ>Skp5up4FF9Py49OM;n%zc;RhCz#z|zRs=zmu3^E(fF_kJz z9>!}Q9PAw!KN$@MQW;Ok!^uEh!;5ZUhlVtMXRpV1+r}?W8vkjpi}T>iy%(Jw{c<4*e6VHttxsMRVW0I{4t?$4hG}tNK6u>tDK)qqNG@{iPt7N z6M!E=-Oy(%zJgF%%}s5Q<@+*8pqeZphm2;krcIbwa^8iOqh|)RTB^GE1@G95+iBK~ zC$mYKTOTaEbv->?UwqDA{3kN` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/euckrfreq.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/euckrfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87721359f9cc89a9fbda6471ca6eccdc1fc00469 GIT binary patch literal 24059 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/euckrprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/euckrprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..518c6ed9878aa3f9c6fd89cd783c07e6021cc4f0 GIT binary patch literal 1070 zcmah|&2AGh5VrR(o06ne1qdWgaEe4)6%Z$cfVAQeQcxot@lB2!l@($ zO(;d|Nw4q|-(g<{MVN#R2Qn&JNsE&Agoix3AUqOu?I$sBO-MifMZr~{+WX^5n*80; zh~Y`9Cc=DD^Qll^*&fb$Ud|>aHDa7*CwVDA`|#lNaCEevYoqdMW%7CXwoK(x=NgPX zXJnHx8-LtC_>e(}o8@02{Q`g>3FRd5F3BnLHo#WO|K^S7_IazzB-WrU?H^Ca-S!kj)fwOf^PGhui0#4~+zimTZ zEre1)JFziid6^r=6gpHP>e`v3g6TqGE9^bqsGp@sz)C0^Dxrk|9s(`oF`RA2GMQ@4 z*f;X~<*q3fyNi4=m{z&ugF-#qJ4*%M&473=%*`pP?5kS1HtZ~xDu#$pU~2?~_UHzU z>FRESik<6}Z*hXW4DmlqnNz6MJ6uKZ+hBC0dZ6o5)q%s|T5Q6r?O;Ao2P@M;^g*LN z5X4(OXohTl^xv>H8qJkR%YTK9Wm?XvbS4IkkhiM5{-7UYlQ28R>;_}SoL3TYhq1FN zm9@q3W@F$HT5FbS3*4%05Vm{Ol}tzpZAL1t6YC;I7Thd62B2{$V%mv1fz#o*Y!=h2 z^6M@sB*<>pL!$A%6!m>^BV@N+gBuf54^aeOG)xpum~;I%lNz~h#INe|UO&QQa0EKk GJ^mk|WB&~R literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/euctwfreq.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/euctwfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8db0a2e26f48865a20d304392ec51d57a23c7779 GIT binary patch literal 54682 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/euctwprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/euctwprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00f506b7bd99ef52c5f706a0912af7251f70900b GIT binary patch literal 1070 zcmah|&2AGh5VrR(+mfVJ1qdWAa3T_IRY05&0@8{LDM%@*v_i6+wcBpx-K4fxRifTf zsn5dmaPtX?6R*ID8E;e43wY)6w==u*^Ue50r?a~DqxWS1EXeTaZtf&ghm_~;>M%_y8sbHqm*a~+~EY;6A5-^k6#abF^frrRQbp+=MW4YqS zF!qi7ezk4O$@Zj}Y>w(eiOo_!-#Oz_Z0A6{koM-3b#Bimz71QGsZJr{6W9g;p;sJo!+QQd~a<3_B(t7~IEPzS4cDW8JI z1RzK-d$1gG`J?}ab;$uQ&Uy8(u&LtJam|k%W;a$af=s-IVv{5hjBp J(5C(g{s5p3|9b!c literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/gb2312freq.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/gb2312freq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29e6efb531d7d3baf0981ae80cc69e9300c36421 GIT binary patch literal 38324 zcmeI*1(#Jvv>;%JkOTrDPKcpF56;pT3nL`0WNw|95o~kRNXWC#BWPn<4{TP;o;TAJ6ixMc9Az@_ zj*x=VKULZjar;zNPzA4XOEaq(pKDfDwYEV#wQVMRMjZK74;>yt)@bv zSZ%4JpNxL#96YdiR0CPXRWh(t83W(!*FYgNZdho(d@W2XWS6fkG{ezZS>AH=4{n)T z-9EBP&_TJerT@{40{SA$H^f4NC4C#`-c;r2cLRHDu$IinO{;0zS$#W&^hO_}g9U%5 zS;=S)akIT1BNV>HQCk)Kr-B+ENAQd0Nx|_X$R@!-qf=GCOZAWOpRJxV&`ooSbAMDV zN6q-#7Rp+qp@9SjQb~VMmU{*^nj0tLEq}GB=5?#3(s#n*!GvR?=0P5i3Tzy4sE&I$Cb@ z2S+;{6_n*$N59&~f2LIxd>GSJkjs(-Gz%zlxsaz;J77jIFjJP-M#q^ETl1RIE~AJt zlD*lMfuF=RH1|{cxMK9ST_!N_u8={J{$WNYaWM@fuJVJ__@rl!P z<1drjISu)fxKRLZcm} zG*Diu->sWP^Qa=<5xhxrwWG|IEc|AgqoQxNAbks?Rm`|<@xhK38@MEWZX3KIOH|E{ z=I*nFZsHOuJS`@wV3pw5cp$E(!WUYys?}mk5X))@g#4}VrOaPjH;$vCrj0UVqvkwG z2dQPQzNBXSVYMMB#o`ULuMQ^uvCJW z;`*CbTC;+)k)moy;jD+yI$lD`Z8N`l8_&~U&Qg#Fe%9BXb+8zNgjp7%d{faFs4m_+}w}%^hyqb(z-~ z=w`_%`ugf?YuZ`cFR58izHypw3E6FpDw2*FhixSZS>#Jw$@Fn zuaD9aOLfPz6pnJpm)k&8r*5piNH!fsf@k8=>su=>C)&Rm(APq__pQ51EhnARBepe4 zf`}C(zQo0Sgz+j^ZNL4E{wGzdH+wVfYgtCiyxwN|IAMR9@sGaY7D{8A&a zkLBy6?}b!rY;}shLr8;w)<*Xz8qxo%<9`GI4*LSaX@KX zH1C);T0xaHBmOUN{^AEu_z)?+a@rw4;G)X&|_x%+rOulHjR(*txIOZHs9D_T9E+cKt{x(;%)wDMmHz1H zj!NH0G<^@uZK9b&s$9z5r0;;{UaPf3YGvfscim_qnG@L7_nPUY8YD{t9I>ruj_w)Q zr>gdXM@n$tXlzLr+14h_kFDEBs(!YW5UtETDoa^~4>I?hX?smun-I;D%1xxSj{KVo5OuONz%bV2<%zE>Z8AxlP(l+zbv}ockOaIDfEY0Vp-4-{{x!)l! zmHm!2nnb>GnlTl$O+jZQcw*pp1K*f&)Z8*c&e-p0&4QAqkiMZ!Z^U#|w|Ged56o>T zX)j5m7=38nTSgB{|CxbaR-0{FK{Ngn*WRhi{${IIYvyRLtzHn^R&X)omuj1&pBQ~4 zuB*8l3=Gp(OJ76HrcT`tMFr&0L!zx8) zaY|yE7Dbj$GG9VR&1zFl_?9u;eP0b~de* z*Da%I@x;wDEuMnndS|Dz^UTUfr|)gSn;cb_ppP?@N_}HYt0}=>(w~y~Bc+vg)ZMlg z32tSfHS*FXlogeB8E+2fQ^SYIIwb6y&&ufJvqaSt7(v_@8`s=UE! zi;O;TULpn~UZ^*lcC<%*x4aqZO25LuMjI?_?pMkfrL?E^cEG>|speZegW%=ja%$!= z`n$#RE2Ewn=ZvmE5+Siw@S7#Gp^vSmMJ~;XGG~-vvl-DHB~d|Esq%>XSItu$jYA&` z-4Ies`VrFKFmTDyb{v;^v&8Z(YbP}*ot z13ewx6L;Ubmt?7==H4p(T(gIezLp$j#ySH#WGU5Q)y zm)RPLO)FsFCybG_rK<8V-G@~zjm*c#I%%`14Xxfi7$Z%4~CZ)QII0;%Ew_Y3m0+T21&~sf`bMjXd*bD(t2rCBW&TFty_}|dnyt+! zrEj=$r#b3m?kvr?3a^SM(r-g8A&JfX!Q80I$ZT(4nwH7gNa851CA&KsVYRO2ey!X& z5zmv#}-PNw8FKF$1a1_(8sA*kQ&lEY{3rGX*sF zV1x752`A)R=_sLr5;7;Sw>oMr;wZN-p;V4$S!1~+%POsyy$u)lsRUz$RMcE1=_1Yf z29~SzN7LpTJ*+RIz8+4*Epa`ix~tN5MiUrVAf&6R%9xwRE=x(!O_A61owv|s^fj%# zX>Ej5_98zvuv+GWGI#RgEp#F>YSxzJdyEy*MDQ$R(|jo|zqpbX8mpEo(kB)&#Ttm@s+yn*|J2@Q?%NkW}<~`Fs&@ALj zZIGjhh$sC-Sw?!zOQ2MyZRWIT-)X*hQ?9~CS}3|^Gt=&%u5z0ioowfaWl8O*j&qR3j6Y?$Vaen& zk96wN3n^z>W%L)4)KM8pJDMBA+@w|;VsCGmao#zYt+ZukjIdfVd?aMC(U#^;)f^)3 zsA-$^C6%wckOtNmu9gM{e$iJ?bDIj*S+c$Kw;Y{wbkO5 zje(|`eI?x?=~vEBBt=#?ZGvf&9jzBvOa(cu(cjSkR8jcbPS{)4&Eq@GDIp7F>8M#( zX<3XebkxJZGW3)_A;wETR?T@aLfmXwx~n;X_wy+;_G6KCv#KhdH%L)OYxPx9%cq(x z?Bj%^f--+9)kH^Yq<^lKXl5+3&_L5tVU50%*n~;4Bye8hI9H`Lf40>hG+zptqpz91 zh0m`S^Id$3?fQ~S?vZbnX-TD;qP|fE(m6`)Z2aZb zDs1k1Z(cWXtISBHg7}W6J57%bM3#QH?Z;Qu$4<#=eJi9oB57pl_nDDRzAq*C*4&>2 z|K)`JsHzW*z9Vj)g-RGmJoQbhKXPLsolX+759e9Nkg< zGn?sQ+IvW-nOi|EEFM#qf#y!OnXdX4TJoBZ{*KbCud|Ta3Yw&OSE}pQNG2|gg;HzQ z6&KUqBG!rc1(>8OHCvf6LAf)r#*Xe;ZHF0|jZQ~Nqq7~&l<%~VTWVhZ<^_238d>dv z1U2nEvNg)uM-!u06|_&%1^S)}jxVH(883}alP{&_IYqv-MsJ*wAdlb~roB=|LHj*! zv=F-J`&*HTC8(vZAId6syO%MIkXTB4t&A@)@C>P*$#TVhpW-vkMS?dPJ>%%Sq~91_qA#EH>+Gnb zEbj`*BWX8BxeN?2 zUhps>m1TLT+162PGd?jeSJEi=S==6dLeIGj;Dc_t)r8SiP zs>NUE%VY5xZ%%~zmRa(oW+$bM5ggyNkNl^1l)jkyI;ixD1Y?YDHu|?|CncDq?|t&S_`U3JWgoXtTJa*8Rd!A+^*L zT)^D;Dp+VoA0e4(^_<;#Udv-%nTS~tU%wJ`)chI!O+Qr)j~_F~I|rR>*1<&A4Uz-uc^LHkTy_UaR1111B{vDPt`Ln6Xo;3KG06F1opstajSDnrPrB!99Hq=2Xx@eH9e` zmC{}-yr-jy^7S(Mr{Goka#=FDqo2h6CDpt7zHv0w8hOm9gwpobM?t+Ul-aaLrac$D zMMzRF-tX#*u5Y#_<6w?db%hKz_nOytwIT~S_gf95mv5{S(N@UE`d&NQ>1d^$|Ly2E zYdmr`wwrO+Y6Y#4NGUZ%;}n@uEnQ^ZFC?jH zzZpp9#3qt-qt%8wYfnturTMK&Gde2cD5bcYM%$XZUaHmxs>wG0maOE6Eq zWBP8X?;EKynH$@>@0&5p=p$K1+GTU~Mf_jHm!!D^tg&132O+OCZ+ZI^Gi|3-GbD{C zB(61fsPwUc4hA;ju4#$&{i(Uy;t$1Le1nD3TlX6Yj@#wWPDwd$n$0pF)=Va@pe+6L zjWBn*X-A~5rK*c|-d|it%{!Wzh0Mb=1HYoBW<3jK@m2P-=1m)HD03`*M=i8Nf_+X? zBl~^F+*M9&HltSzG&E371tTTMp;<@1ZTg~$tEu|jf-`Eqat;nlby~BT(Vy*nxn^9` za$w+_uSR{>RFzi9drnDpa}PO*WhEV?*~8h$B;+^g^S?QN*r6}Jt**0~4pL1tt)jk& z_j$xmxdsx;JVcfsuu#(f#MQFjD*Cdj>TA2KqpI`LCpI^`O(&2bgTA-Ln6aqPRGk?Iq1?$${25q0){LTr%2IUuw;I zrd`%I+T8T|CTpHWKPP9jzP>j2g>|nRNP%;Bh&w_)7hKm-2EqSWSqN z_z&f+>tofcJDs80_VErHnGx|Oj`-J!ET_cPk)V#FwFbV|Y=pbc!FJP9Iy#{*J$Bnn z0u|hH4k~LFR$nvC&#fE7j4TG4Tk@O}_77fL<1LHdQ(7@I(wO_N;CIYDX6|lB8GVa9 zWLh`%jWTzX(Px_V92J#iq~PBa^tQ~Y6huV#MlwI-UcWo{<8giZe; zK_jWYvcY*Oh$^mwquWMvO4`YPapr3NEOTC8bmtU)NWRlj&5)qH)dm~*0^_Xvp>q3* zdv5!^yq1|YH(O|jd~JO%*(6JT2|8Iaoz*t$+ik{4MJ6|`w1M}fDyCUMg8fEktKg2l zFZJcnH%S>qRIt~yHAcr6=xj%SiHmM@nT7gVJdL<_RnW_6x*@?&j>ai>D=G`_=cRpa z?kB3RX+{wh6gQB=QF6hF1pnoy`nne1k2OZeii>A&Jbv9xxQj+ANR6TL z-B;h|f}2S2mZQ}AHkez*+&I$zjG00%8|`bWQ{`Kupx)w|>uV-KH#^_xXp+8#R$DLR znZ7N~)qMHhLOTnca`d;5kEB0fTdSR>c4p)GxzkDI{N&_iP zTc>ZJ>Yr<7m42?iGcs2+FiGYYMjz=*Wk-D_z36C_C2RXy$e?e(^pC8z-P|HVz7W#Q zrcVmlX7Pej9n;M01s$uevvqUhcdOOFTKR5DwZ{zKU$3q;ql~IbNm@zzPxUp%70um( z-?5qgnt3HyZANl4f|FBD=64Nj#&qZYhQddiG0|zCEWuc*UJ0q9xx}Kkv3BKG#Z^Dl2>HiCP1QU?UlVcPio0uckAgmtz9{~a?>Fgt zDQKW+*Dd*4-`l3ebHd_VkV__R(9G@Ac&s7wl-D(P3VX4~?#NR8YS2j&cggXUT-(qC3z3h>L84Z#!Bm z->;TDiE;*>SbU|qpR4b=xxG}MNakv$RTVNzNK3WkQ(sf*|2EJ7L-ADlEaF}$Xpp%> z6!b{a0Y+;&da19C#oIc1$7=6sZZ}#f5hxnDh5c8J!h$%-j#9 zKWm^Ky2!Fs1!*-~D!0Cn1pcEwL*G3KhDngtRx??{d*JGB`Ie|9z8MuY>lk`pix3>*Ko7Z*8Ws(O+fhV|1pY{05?XjS6Xg z=WN86`8!!ks<}I|%CgeYhc;7LNMX~Si>v5_Ws~5s(KUEwMrNbM1pj63ctyUe@0#FD z;+CuBLkT`mODcW82(BggqAZ^Z`2gz-OxAZ^+&(kvN`Kl3`$qHXo2s17KZG>HG9fJt z{3B_XH=7as+-QBZR5GKq(QozLcIp<1`^?;R=EhQFexsMI_M-$_Z02o8k=`^FIZlz! zob2B;`wGcu^nvEL7TRO72iC3aEjmW}kqWA#Sx2R_ zjE+`)Ek|FVsnxzVx3zrf5J@e2_5Go_&f>$w{h_`JMl-8wzxuWs{Xx>kmW*!TmXHM2 zjicQ3;(m}|9{iANaY>|a?Q3hI<~5lYSp2bt zlB%Guq#sN0rO}V{CG;JnyY%myc17?oaqnTixa8KoAY_u#(p&dK!CNfZ!@yB-E3LL# z$R|dJJBlYbt|gxf{>hSyHLD28Wz$tm%Vyx2g<3nE2Q7X`(z}j+x65i~l(1S>{O3KH zQOGkjf1HI8p|qEdQX9B{2@2}$=vxE-SnXHo zBYp&qc-N_Pijd|8){D!8Cer_Dw34{Q`aZT$L@5#P5=Cy-Ok~<(%?=iiC@WaRBLaqpjsmLSFQ2sZsj4XrS)NGA=f{U6P)h@p^`x73^fhxqUy!P_N|RV}mP)_HK1ruan%zPjjFwSzT}L%c zn=D^9UrfA9 zHKVHKjHF*{W)PQHszz$rD(mAPZ3YHDsmXQPe9*D0fng4Q|_3#58SmhH~z zeR1!}S6xV6sTPTwCM3JyA7!2+)jQ(WTH}G>d-{%vyNxg8OJlX)g+y0cc5z7@b(iWp zqnG5H#YW{?rDs6Ac70TEv-`nQ?qnS}iDHW`jC88_h zeXooHvNV$Zthmt<6f+Rnj6V&Gvf5buBKQvjTNL?^W;E~4wMIWP_jBpf8Azu2uYorD zj!Qq^(R_242pOhtf?6u5zK4MmmK>wf^xk#zWJ%_I(9pVfe8c-*-)d)Qfq_DH`N%>s zB>lwBe-Yfq(K*4xB(3VGr6r>o_}h%e62vrZof#K|l#?&9zQK;ZGmuJ=%PiT`j9vEe z7y77qzmR!?Uz#>qUukP>vc^B+f*ln=N^w6q#c!+XN6qRIjMOaabWT#_V_9~Ki>;Yl z<`@!uZXlA(%dGK(nu`m`q;IB>)&^Qg^{eznRo}jMP_o{T1m#n;yn=0t+sJ~RpmGLJM zSa+Q5=aVIukO8t>wop;cvx@veg07lt>?4NN#-o}nxefe;#ptWFpCt{-Xs+*yv+=p4 zIW*@QsB1@QH9s{l-n2h84_aftO0#OF7d#8UTk=Dx{;=*RYEEmRYc~D9;A%!^$y`d( zxAe8Kg@|26Ea?;vG3`^_6Ea=qV05va=W}#G($?nwr|*@ccIYU0y8npeR^R6e@{_~W zq|VUS)@^R!M+L34kKPg_wOTqy@2KUmt-fWA4-nZ4wN&PrninLfF2UD=GniIWs$Z10 zTU=^!=^U*SGTi6^oB2%U8!Am?bh34?=)0mXlb3tG8L>6rlev_mGmh>{TG(ca$@i7H zt&E;G`a=4C`i{yxM3L*|Yb$**J3p)DW(H2k@}IdMNi|7xkpv4-MqEpCvm2=AMHy>v zInAAbqn7OXW|syUXjV11uzX9L_LlkzVWz(He&QJ*xG-u8^Ptpt*~1Dh;I^C3!oqhp>PEG63>Zv;X=fWNWQEhNfpUAw@4u( zb0qiOMG6rWL~=Vwq!4jRBKc`4lG|A$`F&0#*Q-Pd5lJG2h{YrM1zn^Nv6)CA;{6vX zM4Z1!A>y4KDfq}F_$fMkiCBoJAX118|CkJl4&TC^Fu@O~Ar9gq9^xYb652e2)@OIzu@P$kO3Ky37L@vS&!|xn}AA>?!ltXz`Kt)tS zWmG{`R6}*tKuy#_ZPYcFP2#c`vcx3ahaOYq1XNu>l*g37fG6Td@t>u>(7?3%jugd$AAuaR3K#2#0Y5M{x|taRMiC z3a4=fXK@baaRC=`372sNS8)y3aRWDT3%79xcX1E*@c<9;2#@guPw@=T@d7XL3a{b9 z$l%(X@D|>NA5epfbwd=mS2Dbh4-gg6;EKr*9Wn3`{N^%zj8E_>{Mst`cW(FsUm_O1 zLTr2um(Yc8;g|a1d&EIp#DlBDLjokk5ActYkQjdL7m~uSal%jVF=%kM)>VnaA`=$f~?4f?8t$f$c5a< z10Rise8>;~x(EeP2!&AuMNtgJ@elq*3HUfIltO9zhcYOOawv}qsEA6aj4G&#YN(DH zsEJyrjXJ1{dhid1P#+D@5RK3nP0$q0&>St$5`KRdTB8lxq8-|!13ID;I-?7^q8qxS z2YR9xdZQ2eq96KW00v?Z24e_@Vi<;F1V&;MMq>=dVjRX}0w!V-CSwYwVj8An24-Rw zW@8TKVjkvW0TyBr7GnvPVi}fW1y*7eR$~p;Vjb3F12$q4He(C6VjH$&2X@SES@0+Zl!;ouj>;eC7npG$;j_z=+% z11=>BG4U}z!Kd*1lkhpdz?X;xchv>I4-8-98@P@ndV&UkPR*k2|17xxsV%q;0m9R5BX651yKlv;g=qvD2kyt{2n~~ixMb_QYel8PzGgD z4nBPe6;KhCP#INF71dB3K4J?sQ46(E2X#>oepeFeqX8PC5gMZjnxYw+qXqoRI^g&!*QIzNu0uIoWWU~!+Bi5MO?yV zT)|ab!*$%iP29q5+`(Pk!+ku!Lp;J`Ji${u!*jgAOT5BsM0zIzS62m(BnUok4)4HK zaluWV!DUV1eR$$Vh>B=%-)4vopJarO;M3jUlk4CY>A`Qr!)N#$J~az&nh&wyx4|Jc ze3~8Hl^9&Y9=?NLs)jg-i+G3+H_Znhk_MNMghWV;B=BqT@FU!`7knljk|PCDA{A02 z4cwv-(&88Viga+}MEDKA;}84^x4DGBkpUTz37L@vS& zaCJebjvAC&f7VXd;9ncY-&>3CO z72VJsJMZw7yZy5127PSFc?EH6vHqaBQO%9FdAbp7UM7;6EG2zFd0)Y71J;s zGcXggFdK6)7xOS53$PH2uoz3Q6w9z2E3gu)uo`Qy7VEGc8?X_Zuo+vh72B{KJFpYG zup4`@7yGau2XGLFa2Q8$6vuEJCvXy{a2jWD7Uyst7jO}ma2Z!{71wYbH*gcTa2t1U z7x!=<5AYC=@EA|<6wmM+FYpqt@EYz~3$BU_J~|6N#0~EA2=5{a-oyLw!CHulXmDv^ zh>jTe2<{&bALA2z3J(|vpTjlW;Y+yUFMNgAaPxoo2Ch5_Zl?_2BM#!i#rDBP!XW_? z!oBvv-KoLV8NtP1At`=@J8wfWBu5IQL@M~WFQkEwRfCT_!!P(1uIUTu;d0^dJN|%+ z2!hL5g6ro)24qAgWQL1aLRMshOY%YvSt$60Oi0ZO|6&&>kJo5uMN(UCcO{6TQ$Ieb5*E&>sUZ5Q8unLogJ> zFdQQ=5~DC0V=xxuFdh>y5tA?(Q!o|NFdZ{66SFWIb1)b4FdqxB5R0%FORyBnupBF} z605KpYp@pUupS$*5u30XTd)<|upK+F6T7e*d$1S#upb9-5QlIWM{pF!a2zLa5~pw) zXK)tha2^+M5tncoS8x^Aa2+>r6Sr_1cW@W?a32rw5RdQ}Pw*7a@EkAj60h(Yk)lKp z87{jDZ{r=fi6}&Y=K%&6iG&Xj6|T7nAHwbUAqL#n5@N#jNP?vJ5kDarT+15V{uojs z6;dM&enwjS0@tyJba1U>_zkWF4u9ZJc$`7-M39gH8IcJt^bIbi3t5p3t}6>UkQ2F( z8*ZTpdEv^%kRJt55QR_}MNkyQP#mr<2<~(bB~TJBP6@753jd)D%Ay>~qXH_T5?q-O zs=##+p&DHD8ET*=YN0mjpf2jc#Q~u{8lWK>p)s1EDVm`)9hGPUqViZPW48~#{#$y5|ViG1} z3Z`Njreg+XVism&4(4JW=3@aCVi6W&36^3RmSY80Vii_n4c1~E)?))UViPuF3$|h# zwqpl&Vi$H}5B6do_TvB!;t&qw2#(?yj^hMQ;uKEf49?;l&f@|u;u0?73a;WBuHy!7 z;udb>4({R}?&AR-;t?L>37+B^p5p~x;uT)Qy%ixc+#ML)ZxP&z9^QpVaRgU1h4cqCfzgpu$GKE-GF9ACg?=ph!qLTr2uH<<+Y(*ze4h3^puap9W! z5FZJU5I-OhTyh?gASv8I5?q!T+}R(JBLz~z!$5+I-a{Jv4A;+xU+^njR~B6JAAW<2 zT!T9~!k=)@V)z>_BnuhgLimswS>X1IkPX?911@F?xsV%qkQZ+G3i(k01>q{JP#8r} z6s~0r#qkeZG95hbD3nAgl!goJLK&1rIh02QR753IMio>=HB?6p)I=@RMjg~eJ-99^ z)JFp}L?bjt6EsCLG)D`#!Ys5xYqUXIv_pGzKu2^!XLLbVbVGOaKu`2SZ}dT5^h19P zz(5SbU<|=f48w4Yz(|b3XpF&FjKg?Lz(h>KWK6+SOv7}{z)Z}-Y|O!2%)@*vz(Op- zVl2T@EW>iFz)GybYOKLptiyV2z(#DsW^BP$Y{Pc!z)tMKZtTHc?8AN>z(E|sVI09x z9K&&(z)76KX`I1XoWprsz(ribWn95kT*GzTz)jr3ZQQ|K+{1l5z(YL3V?4oAJi~Lm zz)QTsYeafK0#}EJx8N4b@DAQZ6ubw|UJGuN3sK>LpuruS!Ikg9wY%XX#Kgz=1n#d3 zpTSkF;R}3;SojLD;ThY(y%53EG=r=SV)A#aP56aiXY)h z`j8Cn0tqRQ67GZ!Zb}bn@H5iFh34T`q(geR(=ND3IJj0m{E5HtH!{HW_#qQA!$TWF zR%AnV4JaKUIOgR&?GS96C7 zs0cR)h03Ucs;CB6uZJ3_iCUZ#Sju9A%Q5cOe7>jWjj|rHF zNtlc&n2Kqbjv1JVS(uGEn2ULsj|EtWMOcg_Sc+v>julvmRalKRSc`R7j}6#}P1uYr z*otk~jvd&EUD%C1*o%GGj{`V}LpY2hIErI9juSYEQ#g$?IE!;Qj|;enOSp_HxQc7I zjvKg%TeyuoxQlzZj|X^&M|g}Uc#3Cuju&`|S9lG#tp*P(37$m}-iDjGgL{cX6ubww zNrn#)717{s$l$)O5Cg7C4>9pE+zlB%g5)vUXk{~I5#7}VJPDl=Sbcd8kh15ucpOF^7z;iW2I;4k( z!i3-P2mZug_!}9J5t)z~S&$XkkR3UY6S12 z{zVCtL@AWUe<*{pD2MW>fQqPu%BTXj69xC0hU%yR_eX?UsEs#Th1FPtwOEJs*no}Lgw5E3t=NX`*nyqch27YLz1WBSIDmsVgu^(3qd11+IDwNm zh0{2Lvp9$IxPXhegv+>stGI^ixPhCvh1_0TLkr65cNdbp*|X*AsV4EnxH9~p*dQ>E#{#W zTB8lxq8-|!13ID;I-?7^q8qxS2YR9xdZQ2eq96KW00v?Z24e_@Vi<;F1V&;MMq>=d zVjRX}0w!V-CSwYwVj8An24-RwW@8TKVjkvW0TyBr7GnvPVi}fW1y*7eR$~p;Vjb3F z12$q4He(C6VjH$&2XjEY2;!IPK6ANUi0;csL>Mz|X?c*IM{f~@c``H&qs z;8x6#3vP4`d5{#+eFu?d^81zWKV z+pz;Xu?xGg2Yay(`*8pVaR`TT1V?cU$8iEDaSEq#24`^&=WziSaS4}k1y^wm*Kq?k zaSOL`2X}D~_wfJ^@d%Ic1W)k{&+!5;@d~fu?-zy0cnh8}5&Yen;Ax-1-?Iqs!6Pff z2Z#z!rweYH577|=A0a0EQGxIYKE-GF9ACiWoI@;lj(muXui+8J;am62c(LmYVc zafpZbNC1yo2|pka5+ezc!gCnHPe_L3NCD4l2&s@7Y2X3D!6SgfFYu6s;IC!{4~`GN z;dlIjKk*m-hCj3tGQtCbLuPn^z%o_-W^BM?!849l?sE3pczu?B0g4(qW28?gzSu?1VP4coB;JFyG9u?Ksx5BqTd2XP38aRf(k z499T-Cvgg=aRz5`4(D+J7jX%faRpa#4cBo4H*pKMaR+yC5BKo^5Ag_(@dQut4A1cb zFYyYm5h;2E{s>ff3vc5cyo)G!5AWjxc#?gHh7aKhham<&LQME;FyRw?iqG&lzJRB& zg;?;1ctdRXGaca@e2ee!J^by#5Et>_Z&3vgSP2Q?apEBn5+ezc!rur9{`y1kw4IO~ zDUcGWkQ!<5Gt%N0{0e{iBzR6;_zl0~5Bv##RxSART)|&a37*FmJO?CXMiyj6He^Q* z)EJ{q7Q8lf?opedT6IXosZctlBPh1O_;wrGd;=zxys zgwE)KuIPsD=z*T-h2H3czUYVk7=VEoguxhsp%{kY7=e)(h0z#;u^5N(n1G3xgvpqK zshEc8n1Pv?h1r;cxtNFfSb&9CgvD5brC5gLSb>#Th1FPtwOEJs*no}Lgw5E3t=NX` z*nyqch27YLz1WBSIDmsVgu^(3qd11+IDwNmh0{2Lvp9$IxPXhegv+>stGI^ixPhCv zh1KqB}P3&Hb2gGc;@AMq2CAvsdOA4>_T;O|3*H24{5@e6)MI;6*M_#J=X zPyB_y;ZF&KjL3w{$bziMhV00JoXCaT$b-Ddhx{mjf+&Q-D1xFW29IbD9zh*E>noH% zNt8lq{D(3qi*hKB3aE%msEjJ8ifX8i8mNg{sEs#?u?S6Aj784HyulD|y0 zLRkxz$zLc-)93>_4@Rl)0SE8A_0HRoBLDyY{eSHY{13AN BbYx15ViL!+h~)Nq9TE~z==q-Ra+!32tiZS3n@sst&ptE+D*6eZc^KONYz^^ z^|$bsd_v;HU*N=yHz~;lyt4gvW_M=%=J~kOY4?6~zuAb8pJZ(WfIq<0r?7CssU#&$ zDMjo_uk=&jVP6Jin1&7qGAdhXi;^?KLmu4`9tpbe)0nqLq#ysH5UNk@lVL4QaWXez zaG9x*FkjVlEEITl22);Claa}c7-sopQ3jq3k}|0 z<7J~E8-6+c^f`wl55r#~{RV&_Ddi;f?#Tt^lzVq^>WhH;Jh&qZnudT~)qtaW5|9+D zZrP+s&=i^D8F1i^(Q)e6uoz(l-LSiSjRBS+1vf(3PzfyzFcD}WFJRwdESH(q zjD07+-yWE9b}%bud*iy0e6LhThu4|l2RU%hg?ZQ~VNQ-|Zj%8L&>TDvgjjN=a2VH&9kFir&AY-=8SUKgjM4T{oU1zfK zIPPo=Tta`%Ts?xg>M<;~vusT+q=a508>`AXh>-{_#R z6mn#D8l`BwH)V5goQ~|a>++gx8YM*#MT4wRW-j#KN*d%E62EJX_x?E+gEB~{d%Qn= C!~OyQ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/hebrewprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/hebrewprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67735af420cdfd89c89fe0365fec476fb946eed7 GIT binary patch literal 2912 zcmZuz%WoS+7@yf!)|<8SZk~j;JPl2v7Se~P3L$Y*i^i$qlu9em$nk6(JC5zl+HGT8 z2`Q1vku&1JfeV)&5aKW3ub2~vQ$Rc<9*17w`)1cp>~>f4n{S@`o9{LIRy^(u{FwMC zahZ^x$*IQx`8_DX1prPsEt5U!QHruw*7kHyr(~6Iof}7l8$LbMJ%gKBlC+K~EJ;!s zU*5@ytY5z)s$0H*4i}|jrI4-X>V6(3bsjyEg0DdEiAOo{G)_I8Yp|>CncVO!ZhC#( z@@(Gc#klP`Jm&Rt$8&kV7w4{*;Bjw&C%nPOWSjBGMsgx?T;NB9HbPlUe^{zmu*;a>z3pzz7)lhvP^NAEVBbas92>ea<-b61=0 zgJOkO9|Ut3FD)+SQIq&!jXJ^-+yJPPI&G0dt)v~oASW%tbcKdOQ=z4>Podo+rC2x@ zPCzqBN18#S<_m$AmNsL>O0mwEoMhX@O0LZEU_4f?7K(Xj1o^7)<;3Zs`^BKq88KN+ z`1hsDw)}0F8MX#G%WKL5WP(MDqP8jgz^{X27=d5jhC0SrzMKmJ#=ap>uPoH}Y74bu zZEmYkEc3ZNap~fI&gTorjQjOYy`yXq?m1sO5JPaFFHli~0E8x}b?R-7oi^Qk``BHY z)?nE(ZZHGDLC-8i$~BNRg`jQFqn55QNMZzG6k!Y?NyQ|}(;dJq#RS0D zPy!o(AUngN&EYO)N;mm-U|`*$h39H1S}i05!4jHO6K7yVi~}Tf^8KF7mcT_zSOepd4#g;# zyH?2Cl(C!X%+hW4!P3pPxRzRLi-fbC)$D%oRQW0748tmIk*99t- zY9*xneTQwqVOrAJ?vcJz3vAj$sbLF_2*_7LCO!7oZ<^(7JZ` zQthvHJv|%u0H-yS>stHg?;%r1#gdo>?n2!j{g9pTmJoP0X=T?pX^dGkNQ+LGeO_Dq7Q3W1vZ10y=#b#Xq9TiDk6Baih?DG5K&9* zozyY~JPSU_*h!+2<7?>*3j=ET*3t%BNoO~gGRrABa(jI>y$rs6EA{?H>K@B1f%=C( zOlR+Q_o<8{69vc|`D$gm$o)#*R~bkSAoW_o#Vn6G zrjpz9{{!AC856^$4&)-2TDlDw$%YLXv?o$dukTm{eG7|<6buN_JXLLTS(F`d-Ha&_ls0kOu2oNrz}Tk2X4KVQ-cI;$IZp&{mkv z=V6%&1F?V-W_NKB;Q2HKPM<}F>Tb~!>i+AwTU2NzXYkfX^}?<1FwFdoGRiJv`*5{~ zBjP-MFNyFH!W#%LBfN?53IhHjidO-o8)Z9{oy8*dUqiTpa2WwFXLbLHb112(Rk8Xu zG^Gs}5B!tV55#pG#XlW&AQ_MT4Dx=t%-D&ufD)!~lDbyWpr1ksPzSbV&}UxLFb(Y2 zT*r271Kx!Fjyvrd>MtmhG-W*UoA3q{Xgq29mBwBW+5o?C^7&B0k4yV{sK6W8Qa6rE G-TeQU*psLL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/jisfreq.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/jisfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e769549e85068e21c100242247c05bd7c34653 GIT binary patch literal 44468 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/jpcntx.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/jpcntx.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a007ef844605460ddf7a1e3ca53eb611f5260add GIT binary patch literal 38607 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..579e3cf48cd0eb2c079a1f98ccc1372e05a0db57 GIT binary patch literal 30373 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/langgreekmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c3b524d5f51311f62ea67dff8e9c03b60a12573 GIT binary patch literal 24500 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/langhungarianmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cce45486983bbf2b667d8d3a064ebc6c80bf6b38 GIT binary patch literal 24796 zcmeI4cbHve5ytO^O-Mol>GT>(0;CfN0wEAODL_JTMVBS_k}Pa?m$MrJ*n96%RFqyq zC-mOzy`rwDD7ILzH>~@Nj& zeNRUktM@OeOni9FKYL5p{6qM=@Hb&AVS=!yFiF@>m@f2AQCYLIu!}HL*io1$>>!L6 zrU;XTLxtUh?S-9$y@jd59N{2gFG0Jk86b=jwh%@N4Z@bfFky@^L>MP*C=3#Y3ys2H zVN+qQFjN>QY#@vkMhgcBvxVLZt*qHdxKOxAxLCMExKy}IxLmkGxKg-ESS4I7Tq9g7 zTqj&F+#uX2+$5|PZWeA4ZWV45ZWrzl?iB74?iTJ5?iKD6?iU^q9uyuD9u__(d|WtE z_=NCD;Zwq=h0h3|6+S0?URWr6LHMHZCE?4$SA?$$UlYDAJR*EU_@?kJp-1?(@Tl+| zVTN$D@Lgen@IB!%;rqf5gx!V5g&zt(67~~*Ec`_Hsjx=)neZav=fZ))KEf}AUkXnM z`w9mO`wPDkel7e)I7Zl5I70ZXaENe}@H^o!;rGHO!Xjb5uvpkem?s=7{6YAm@F!t& z;c#JBVKd>+!e4|Zg>8jd!q&oHh2wlvn&UA6A! z_Lk+fp22M`?Mqj*EUleAY-MYEwPR)1q-oP7vKh6%$3J+qk}$ZUi#QWzzS7RCr;g>k~Bf*!t1 z4`jB5u%)0+e5U6v({ubEZb(mRww^6P^yFu|33|V?Ny21d ziZE4}CQKJ*2zv-Kg*}D61ic~o^X)BFAA?MvfK2avrY}b}ThNQ2%@Ga|^r^_^3I_@L zHe`C|vqJ^F?wMZMOkafTNI~y+rguJDAS@L0fynex%k&M&^jXOCMac9W$n*whdV{kQ zgcl1x9<}ZxG%nyh(Vo@D|~%!rO$m3-1u# zDZEQ~x9}d}y~6v1_X{5o&JoTP&J)fTJ}7)h_^@z+@Dbso!iB;`!o|WR!llAx!sWsh z!j-~R!Ybiv;Tqvu;X2`Z;RfMG;U;0VaI8i5 zA-7e^cEa|;4#Ie0M`0&nXJHp%f-q6oRoG3~U6>?H7N!VOg=xZcVTQ1WFjLr5*h`ot zQSjvRQ;U;0VaIYU7ZJFG&ZWsV$0NpS!67CQ5U1;H+A*f+Q=7zDNq zf;&@Y3pc2Aaf(L^{Zi8x$7ofYSFCbF#d%@e5^lJX+zM_jq~r>o6xCLk-fI=_=F>u1 z{ciCY^b5O{b=kufWnP+?-Ebu-)iF;+D`JdW!s=sL=v=mo#|>Mu0+#!65eT+WZ3WeC zIKz1)TlESEw!&J^#qGy_v`Vd-iiP!aQ`|YFI!2dNUbsK*^ts$xA8WaxR0Gu9Rr@G- z=};SD!R2B-DXy*5^u@9Mx%T2NW$!O{)v%>qgXhY%0F{&wW~OTK)3}@B}4}Wb>58Zb1#3 zqq4az3s`pDlnT2nO|q>LD};-PAE#9O;-x3+IM$ zOSo=OBCj}wfr|6k+*VjHtRMC*R=Ei0(HS?yJZUH^o<60zeM+b+R<=vHKbNr}E_rlL zsb1fcqB_RiTg|;DmpPeM&&%e;P1&+Ik4YJvyTY={MPP*nbRoqS4eWX+bmsab=o#w7u*R6$n33uRDP6>it1nw`y`uj=D{mbMExf6I&E-|&BW2D$( z)u84!@Ii)a-GyWXTL`&>=L)XPRm%!xyRe5lyNnfVu^TF7sEkGfR|JF#R2pD$B$gX+ zMzCDV86lZ2oJ#{@?qZi&h#^p6%dLDlSazvpATANr76Xw?3Ww*$EUXs@%lJyTKQ4l0 zP_a;L@kenADgv?88K~>J2$wSQ+#odp$;GPk*q1U!BgP%jG?mB9R$ay!)N(i~r=?<4 zgf131mo5mw3Ms+OZJ&CELTzx_!%f{FT!~WvDQ<;eH*ATDRb`Z zNMSdU9V3MXZW`2ZF8xTh6}k|kLCSJjN+6bdq*K@SP+66x`g({E^E=n4;RajVv9%5739%?BT=!K-mz3NDOjmI8eox! z zwMB|urXr6Nx`Y^I2*C>Ni(64kXDUJrmovg+;eLRNr52SK{cNRDNVerX%7~Fi$~tVZ zs;%5f$xEf6auMXEuEeo$q+OCp$rVVU%;(}_6?Y-e7F|+hs3a3}MR@eA8dgaT4T8W_ zL9j~-7>ztsP9u+4$O~iSx^Bf?<>t|z(MU$Mg@Bbib4UrTI4uacq_`CV zmId+Ah;H{*z%CYDOOW?sUe-r1Xwh1 z443w)SQw2X=^T#Ct;iK<t~1*8rWj`kWxYotx_&s zg6eZ~_YGxsX^>kRQgBliho@BT#glN1}Vg-c%Cg5%sq(t zoZW4O&vpE0<54?ONyJL*?GBlklTebLT##_V^o9`3jwKfX%Lc&g;eso6k}EPAcn=v#JGFZ(4~anew3vu zIEce@t{^6S@3A76#9hxNqLIK0>j6?Q?YmJ0sdsk~II{t9<(3&`~X`6YyzbV~5 zy?O1=Q_t=F9qGj#3-!a)^IJNbw(0%-X#I3_o<3@=Ft7I~r{{N6Yi&(qp6a<)c`7>g z_|VDWRh8@k{b-=@I-Z0($M@`~2B>ZIk_^l7KJ)T&eT(I%aXY~x;x7S?JR-3IG>N>8WmkmY#G&UBgm4?Ql#rprc+SoXt;hBF1Kg<3X D#VWhv literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/langthaimodel.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/langthaimodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..837005f3910db1cee1e2a9abba13ee6d09eecd9e GIT binary patch literal 23333 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/langturkishmodel.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/langturkishmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78b77e9b1b3f302c30ac11ced96d47fb542dfb9c GIT binary patch literal 23351 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/latin1prober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/latin1prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..169cea2d6c0844a56aeff771e227b2813d6c78f6 GIT binary patch literal 2883 zcmc&#-ESL35Z~SV@cD9f+>)jZDHL8%jg&^=LoHH86S-eVX%cV>(kZYw-nHZO{E@x2 zAjWwik@^V#1~2>({2BWM;sNCk;H6K@?4_|Cg+jywyV|+go!Q-)-^|XvUnqprzZSP% z%nDi9j5y&IZI4is8JTFH*g!4wT zjGJ8Z$K)sp<eb1kF-JJqA14GkBFEO(Gd}mq=!yi5``)$Pai|F zkuo)f%1%vHrQT58ZK+@(Lax`G5~!apL1H1>hdiNNwXkryGzgUs$Y|D3oa4#Dbz ziB@a6)mh4{t)mav@Qb(NNZ$dXiKatx$adKw2n87u?pW#$$*z~J!FhD8>>Drb_oPx0 zY%>AptxijGZc03QcX|E>5A|5EDKK&-vpPohkR&QSw!HgQZfv^%`&1`!Ul5_myT=w$TR;tw#bLeN1_qLj4Cx^~px3#C$;{yf>%I3&{qZvpY?LwHGs{~fu zp)2S!rk1t0>q8iG8@N9hx*kXcyA4@>7j!YD_ex)&EDsnuSwIz{TMo^9qm@9G@^4yt zhs#bgX{9?nks8)ga}pt50Wdea6`S3q3_v@1(iJkvaw1<@U8z=WLg3>v{@VH`fAYZi zJjME8vjkoc@@3DahzYj$wFI#;v~EHS#mNJ5@%^01AmcWq6dI0BXMqqJLJ#Z+;LGS` z8nVHqiRj{v)2O0VI4ss%z#!I|?lM5IgxRG5sa+SbAHsupM$}Eg4p`?pt_o)k_2GvK z$a*v68boQH9Izo13^X@T6L^2dt^vxqwdQv-KR^0yaC8sT-Zq6*(Bgiw^ucm->xW|1`y+<{kBD|>|}6xx~ppm0M+d@T0(Z}@+?HfCM5hw{5>3V0#-y_ zhH&|87T#V!T_>P}`3bNl_m-!y#Np$C5*Kpb?uvebe8l-)zm{YYTZHVhHvv>8sE&GH zT|*aMM}h@by$b|NViwxEOcKsVcEekG4V7$-z{2`9j1-xGMt9^A?^{#@U#(8@Gp~6>YoRw+?Nfk)tb0q6HMXtK8-bAmiBY6V}hHVtu ljKjd1;BJ;aAER2j10^M^ z@;ABGT;RWko__>H5J6MYp%JCXvy^q5$mzI|OUYv*9N}IN;YvDkB2Rb+r0QQ%I98>m zv~?1z1F4^>?vYegWdWuH`-9Uj&gSeK9A33o@e79PkBEw0t1uMR-A?f+&eHjK!D4CDA;1xoGa~_EVjF zd#2?LKL?d!1={UGE2=k{b&n7nok`C>1V$50hh)UsY)A$D)rM?HxFZNqS1`d^3^-2^ zaKWiVkml1kYw_bG)lyxe+Ny87yx)^bc`!2p=Sh}m&dptsxc^c=MHzDj0Z8w+cvGP$RH3iO_Aj~=co&58~hVJw>dP#5XsGp=_t)o8q z_%xPc15XO6r(@>`S8}O)_6gT}XQ}}DK7gJFKnPu;KKur6-yW{@E9aY-64-E@Mr;!% zuOl`B;gGZ)^$=;BP3Epzhq*hR3yA8q2(r4G107Xgp*Q1zc}jxAY91GgNJ88}6(l(h zWn5Z7vWVmkkTvKz?jp1dmnqslcyq>;toj@G!8>iC4s=43pCMi0bt%5?a=oi}I=xhO zWTvI4Db-aIU&c;MJu%@V)I5tj@-tLtvy2Vio8idy{r}S+wFG)+*bguf`*BNte$Do* zcfHy>tpv5p^B`!;JkLpo#+piIx5p`+cl_nfIZNc{Gk zfXZnH&7#E?cNgX6|h>qvAO`OumZXlN95ccLXE-7Z%}_=2iETh zXA{Sz_A<_f?g-oijpG&YMmVbk>3#AGo|wpgAfUmWXkb>u3fR62x?kC|_eR8W_eZFG z^|`BFUHJy{703XuK6vL*UV;C(d@3i2u0UOPRVCJyBLE(d*#uUYLYMzSt3EKEf`^dC zNo8iU*c3DQLh~F!Qz0}OueQIxw{QHk+iC#-|RQca!Uec^p%1Xwb+4%u^epq824C80gz-dyRcnr)V3Ns z^~YwR)zw^P-G1wYi&)2|Z1r@r<3z};Db3QslfC`M)?tG;p6u6P@^riE*)lW%ULO2X zh9;2s69BUo0!(X;F4)qT)`xl*Jo*xPz77O|XAvqjfQk*MYdNIjl_j=Hi>%B-n1h@R z-k4EBc(vP02ayAwk+kV(Qp{|OChvpb_6kxcilC1Rmku7yuzE922oxd0Jk~wHe3A1` zSM*clL(Wh8aXOLAaW1+|&MgL81{4C5@nqKTjZ~&>+U*2pd64= zsV9C2e`&=5i4%W;6Ehp*MqO*h-^{K(^L?{>?Y7_fwf5m>laSwJWjTPKgQ;)eIN?-~ zoW_(QwuF`2v2Cy|oZO9FgB{Vxn{m@%SG003_6%+aKM&%-;HC)kcHB0&CD!sz+%eb_ z_wx04oswh1eI8sB9;9?($6X!{NYwsAp^b>@Ztvqz4$|^iUe1bBc{xfYWc~BAR|mJz z;Ncjs!D^6dmB$0aUy?a#{b!IF;AR{Lt2sVadw>mZ#a z(~7YXU5AqqUeM|gj=&uHB&!V0LkCF#*R;yuaI`;yn_4AsQ0AlZbCtoVnRaiPEfMn4 St*1+Ap5gUX$Ty^S9{V3}Uj+yN literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/mbcssm.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/mbcssm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96167b7f2af1267698f79f2a6c4055534b65227c GIT binary patch literal 17518 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/sjisprober.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/sjisprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a01cc0f25d0e9e6fd574118fe0ababe94a8a21b GIT binary patch literal 2381 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 alE;K`DEHeuZtiJ)u;Hpdj literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/chardet/__pycache__/version.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a7c61cdff4b409058eb2bd5f41c602a75f643a8 GIT binary patch literal 381 zcmX|7Jx{|h5Ova&qM*XYd?Ov|Ld#SkRG~7k6p12+3Mq18w=u*Y*iNBc`8CY^n@mXj z14brH2|elF-RYj5-rb`E*Ic(21{lvR}y3?Qf5HSAa|xEYQe(XWA}MSZH4AK+YLY#Y1+zGghop45GD8>>2^R&C8yXx@B60dZ zjuwLO0%uBe;&pR?kMU_0;7KQ{T1i4xmL%0)lGMih(6rvUt6F!LH`A-@$r~~|{tX-W s?)RL~J +# +# 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/venv/lib/python3.6/site-packages/chardet/big5prober.py b/venv/lib/python3.6/site-packages/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/chardistribution.py b/venv/lib/python3.6/site-packages/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/charsetgroupprober.py b/venv/lib/python3.6/site-packages/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/charsetprober.py b/venv/lib/python3.6/site-packages/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/cli/__init__.py b/venv/lib/python3.6/site-packages/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/lib/python3.6/site-packages/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.6/site-packages/chardet/cli/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/chardet/cli/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cbc682d0065907f669bb70a37509621c0afff2c GIT binary patch literal 138 zcmXr!<>lgkz!$^Fz`*brh~WSv-~hzMEI=ZKA(%mv(QhR~5l9$8{4&=s$t}%zNGwW8EkV#ZnfmeZnR%Hd@$q^EmA5!-a`RJ4b5iX<1{MP` F0{{klATh#xZz^H&$TDo{6*A6@p+Fc7g;51_Q^NAj+fN5~)$k z{g6p&#v^M^%GJRBfW7T$ulYGV1;{CXAwYn9#g@i0e98I{YzrcbWU?(9Un zKeWF7K60ENosG|j{CE77M8TcD!(HxWZtnHH-0%B&&<|Yd^RrsNX6vvYq7Jfp-sm^% zSS{Piqkd%NFx$?X{U+oc-r!r`x&0m9;t}75)DpYA`N)%nXe}LR_@6oL-Q=3nGprOZX zSQev{V-3M>ci+2EzcA2ai5jNqOUnD*+fnq%h!y493HUUX? z+;hIUcJ6C;;V<2Df8k9$l3WLpFPlfsV%0)laK%{y8N5clOBYfIoYd#P*m&O;dL|2&AUN>-7$>g)odJnBMhfa6 z82~J6Ah2=-Wqa18v=*{dY3i*ED8!fG(VHeR$yt^bLiN}Kn6e_%B|8>4A9QS(>{fI1 z*>t7XW1mpOX=RumoN1vp%@#>6dh8G-4X<_sIAs}Ni<6;VyWWP~Y7Ta3`%IV~7f1!u zSZ`x~_37>N9(%ff{u17v9-N!#Iauc{s|oZ;p=OyrY;Vgt4%BSXMiVKMGZT!2;3nY6 zI#U~Fr4lBrv}H)DAs2)!kXN3RLVTj?V71sXG}mo7K|F+{g>v5OwGV?jGtUdgL1zAA)J@7oem7SZMzXf_5e@5#KWxuyiLL_j!Om zpVyWy4|O1K=-MPKLMkWqW0%*T)c|eM1j+Ge($HJb+t0RC+x%R5LC zf6`n!@`>Kzmtm#F_nvvKqj&V~g2wii9wpG@Z@+N(CBXgl`H%M4KL*_)&VWju6Z26V zSt5^Th&srEx^NZ>_$1N;rV|Mod=b-7Kk2bgSFpdBd=q5FQslu@4AW66_=--~YjtR? z3h0y|7aw@+5Gc9H9zMkRcggx!`@L@-K4ht4GX*BQm10<$qNp=41M|6#xjsfoH$$W~Qa+XnO9|=l#x*}vwzQ17n z<;D#zMhViXR}ppFcyeIeciMpo#v+@VfIK&~0=_F#Un$SGI-M0AoBB$aH?Q9SaUHi6 zL!!1l6DF1wCixgum?m7hx76Oy60Ek@xOnsm0l?_|M`F3-TKrnnFb(=`wyJo`p1e}j;JY3 zGvPeOsO1~epagmVRNFg2z6N;81_~1nW}}gi@-p?%!@)$>9!*v9O{4u)cDrr&u)SyMam>qM9GfV{3kt6a5yz4qKhmdy?g;rd738L= zud>d1*Ke&_UGOrVrPURAW!;HaSoO53UYn(~w{7L>dP8(GVm-PGHwx=u 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/venv/lib/python3.6/site-packages/chardet/euckrfreq.py b/venv/lib/python3.6/site-packages/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/euckrprober.py b/venv/lib/python3.6/site-packages/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/euctwfreq.py b/venv/lib/python3.6/site-packages/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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 +# + +# 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/venv/lib/python3.6/site-packages/chardet/euctwprober.py b/venv/lib/python3.6/site-packages/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/gb2312freq.py b/venv/lib/python3.6/site-packages/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/gb2312prober.py b/venv/lib/python3.6/site-packages/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/hebrewprober.py b/venv/lib/python3.6/site-packages/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/jisfreq.py b/venv/lib/python3.6/site-packages/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/jpcntx.py b/venv/lib/python3.6/site-packages/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langbulgarianmodel.py b/venv/lib/python3.6/site-packages/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langcyrillicmodel.py b/venv/lib/python3.6/site-packages/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langgreekmodel.py b/venv/lib/python3.6/site-packages/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langhebrewmodel.py b/venv/lib/python3.6/site-packages/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langhungarianmodel.py b/venv/lib/python3.6/site-packages/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langthaimodel.py b/venv/lib/python3.6/site-packages/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/langturkishmodel.py b/venv/lib/python3.6/site-packages/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/latin1prober.py b/venv/lib/python3.6/site-packages/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/mbcharsetprober.py b/venv/lib/python3.6/site-packages/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/mbcsgroupprober.py b/venv/lib/python3.6/site-packages/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/mbcssm.py b/venv/lib/python3.6/site-packages/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/sbcharsetprober.py b/venv/lib/python3.6/site-packages/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/sbcsgroupprober.py b/venv/lib/python3.6/site-packages/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/sjisprober.py b/venv/lib/python3.6/site-packages/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/universaldetector.py b/venv/lib/python3.6/site-packages/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/utf8prober.py b/venv/lib/python3.6/site-packages/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/chardet/version.py b/venv/lib/python3.6/site-packages/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/venv/lib/python3.6/site-packages/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/venv/lib/python3.6/site-packages/click/__init__.py b/venv/lib/python3.6/site-packages/click/__init__.py new file mode 100644 index 0000000..d3c3366 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/__init__.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +""" +click +~~~~~ + +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. + +:copyright: © 2014 by the Pallets team. +:license: BSD, see LICENSE.rst for more details. +""" + +# Core classes +from .core import Context, BaseCommand, Command, MultiCommand, Group, \ + CommandCollection, Parameter, Option, Argument + +# Globals +from .globals import get_current_context + +# Decorators +from .decorators import pass_context, pass_obj, make_pass_decorator, \ + command, group, argument, option, confirmation_option, \ + password_option, version_option, help_option + +# Types +from .types import ParamType, File, Path, Choice, IntRange, Tuple, \ + DateTime, STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED, FloatRange + +# Utilities +from .utils import echo, get_binary_stream, get_text_stream, open_file, \ + format_filename, get_app_dir, get_os_args + +# Terminal functions +from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \ + progressbar, clear, style, unstyle, secho, edit, launch, getchar, \ + pause + +# Exceptions +from .exceptions import ClickException, UsageError, BadParameter, \ + FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \ + MissingParameter + +# Formatting +from .formatting import HelpFormatter, wrap_text + +# Parsing +from .parser import OptionParser + + +__all__ = [ + # Core classes + 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group', + 'CommandCollection', 'Parameter', 'Option', 'Argument', + + # Globals + 'get_current_context', + + # Decorators + 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group', + 'argument', 'option', 'confirmation_option', 'password_option', + 'version_option', 'help_option', + + # Types + 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', + 'DateTime', 'STRING', 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', + 'FloatRange', + + # Utilities + 'echo', 'get_binary_stream', 'get_text_stream', 'open_file', + 'format_filename', 'get_app_dir', 'get_os_args', + + # Terminal functions + 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager', + 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch', + 'getchar', 'pause', + + # Exceptions + 'ClickException', 'UsageError', 'BadParameter', 'FileError', + 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage', + 'MissingParameter', + + # Formatting + 'HelpFormatter', 'wrap_text', + + # Parsing + 'OptionParser', +] + + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + + +__version__ = '7.0' diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..051936c0cb1321be737c870b52f499237148bcf4 GIT binary patch literal 2618 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/_compat.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/_compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c30ff940ed43e536337881284219e3ff1ad0899 GIT binary patch literal 16749 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 Wn|z=DtzLntu#)4y1AVO0f&T@#HI0w} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/_textwrap.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dcfd260d5faa31fb7111bd3d86c7a40285d1145 GIT binary patch literal 1297 zcmZux&2HO95T5-ZMbnC!s7dS|f}*!FKY@mW04drc2VGhu0g-k=b2m0+ilTSP zSTU%Rl84EqPtX_WE9|u=zd|m_jHomM(p~ImcK&ww?YH{&+O_zfzemshk^uk0*1$bH zz~%0u(4bifDgE-2&3MWg`~q5N`3kf&FcmA23eA3lB)GzOm?X@P@_E&mMKjB)?8Mld z>>q|eIC#oTJ=L+Z5BUexnC z+40hu^11)anis}8qg8&|R%gyfd23Z!RK^e1nyGwnQRwE>$F9zDqe}C<@v_WZlZw1; zys*Z-0XxRC-+pu0%<99ssP7%OMXB$7Z;pzi?7PKbUKaV;Mk>093&ic9e(7(h)2z}Z zmi^G^01G*)25iJb7O^4D7^h^HceWru_#`vul!b%%vWttZ+5LX-Z5uxzLN zhe(K7gvy$hk5D;5JQhD7IoXsEoqmEp?mpv7v6P4s5fxw1nY0JE6S(73*#({4TNCem zjQH>=T37VS#KaN>J&Tjj@0hBc8JjhR_)-=PQOVg`7+`Och$vJ}=S7u-Jxr4L;JJO_ zMWGi+EzGcc6iY1FLSwhbQ_ZXL<(KGkBNTwVxQ%c`xW?>qZySoO_(?MGky2GQGfMeb zso7k&NIT_+N}ab^*?a6wI+A!~_ep$3;$s_YjqbtH8>i>y2-%27!{Kmk!{-;#_Yl8* dy!qEDi{ri~W&K|{AKmZ!`H_%xbW_NC@g6=KLRJ6( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/_unicodefun.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1083d6c0ce6121061d658f1d1ee7a00f85cf80f GIT binary patch literal 3329 zcma)8%a7Z}8Rw7`MRC^~Ki2DKQ^JT{tdZ3gc2OHfQrOtqtpmed#BN;+Z3K!lT2Z1% zdSbFqGiPyGP{w>V3!UOlrOGkd#dbDKMMMj$zznm9zW$PQ|)00qN&7-wtL~VBjE} zT60S?4blr+Z4er5j~(tT*qm`^ZXZ6G;nt)h$1^r|$1SkaTG(TcdkZE%2dq73Gq8Qn zn%i$~VegMSGiw}-R~}k&II~|^yVjdquRse7wx3Jlt?KmmgdWOhDx^(&zu(WW>Gvz^ z*o)I7o^&@?tDxT>mb#P#Z;v7sX)P;99Vyu|NQV8rG#^B%svMxJ0;MCV)j^_1l{f4U zqIg1coO4n6ao!)M(VnW#mRUleewt_@>G7F3pB70fq`9%_NFUgH&QMM(C*g;Gx8yni z@9u2tX|Y`-#nzxqQoeOx+)M67zdYPF{5E61!9FarZgEsy?+=rVFM%f{`$qH+fK^?^ zU@@Ns%x%7P=3#Y~xwgmT22M}xN2($>GWPon3(l0!Em+K2wbZ(1V_RM}duIWw&MaWvE7ZnR1*cEh27M5{CtN1)}oCjc{q%aG1;b zabuNGX_;hu3V5F2Xqrn9&v0uR=_JoWB}6#Vx=;_cYkPK!C{2Y{h0Mp$f$G9lwu>V@ z%Co!MP!+jcJW0jANH^P(;;U*Icj%Fz(I6E+wmoSVOc>KvezQ~Z5vT`<+4?L9$bu8z9+8(e&SLcYzUumsei)c z+LAtn>d|$$3`-f31JVHk+Fe)+WTZKJWo4ILOM8<*e!?vJLz-Z(t<3%-T#GvsM}9^a zxI4FX8wsN|vA<^W8-vfEJ4YYQoN;OS!uOW>K+l)=&U1*`XS z9|6fG9qhi?#ho`_fEU=pK)wOB%QL^Gp|A2QGy4)G_>!5l`jg{NA7=`QQXw!SZK6|T z`-#l6smL_N-(H?`6A#N!fV=M+M-K0Ho2=Z5RGcKT4S%RwMXr*=%1iS&O2x6g6>Zv; zr!>z?ZDt|m_qb?1soGK$X%vfhUboc4t^4mB$951L|Md~)2}N6! zo{qf-AsEt>ERf%|n1)%7G>~YDq44)FpKRR^YF1QuAP}}DkL+W`mq})tD~-^f2xJ*4 z-joTc17Du*Biw=kLE}6dCVM3%0i&cEWka%i{MKZvh5=O;l*34+BHZa39>V6q!6=DG zq*g*Xg^oG+2q-sAlf98fW(y7DI&U}-bskETDv{TYLgXvpZrBKhd79=2v^#CJ{YWN+ zMLh_D5Wo6O_-v>D=-IPR8;<_xa z1<1H2B^Q+chccfUB?~yvlF<{}EZ>n;g7;Q=5Z+YB_Qzr6)%;fOGjMnOk05A@3e^E) zKj;@OOB8DXQ5d3zy&88gC~KE)l;79~vY-fLxeg7NWnmblV$#%=085_33FwYEgbErd zPUtiUVaFRc)eY1ego+NZr5BBE1V8?^X89mVQ-X?$rhdtv0$zDkZDU2@pHIr7T1S6XNHIjv3%+E% za;aylI*$)yQIHZUJ69-)ahZrD};oEhG7Jx@gP&-YTWae&g1?0DWga?o&dm zTwOWWd(ghJks^ zbpp0(uK`MTaBBM~-gxDjv28QkIgfWA;ste#)Hwp?`Zk@&$Dp&hDz`DofQH)`sy3S7 zX%XqVLupUZWg)FdkIp=4G%T;sZE817gJ2My5|6qGX&Mjzllu9usF7D|7<@3{+pFyj J$3N$v|1Vjh%|QSF literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/_winconsole.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aad3ea56b8fd3da8e1492f4c7e869eebc8b247b1 GIT binary patch literal 8741 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 JslSfm{2y+7n$!RQ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/formatting.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99901efc0111ce36f685ce96678213452b2c3d3a GIT binary patch literal 8515 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 C_hn%K literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/globals.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37aa0dfc5cb9db4a5ce7842a520297f99a1dc857 GIT binary patch literal 1844 zcmZux-HsbI6t-uQY&M$>QmYoYKr$7m1hrWNf>seipo&U+6QS*1zzQjG#!klBneoW> zWPcQHn%?pth*#hRc!jy;YIy{1;2h6Pn?|? z86m8{g~yIz5=791r1XqZBI%Z#1)?uP(RxMCLeUnTSLCcE_Cy!nZE+}i;sCyM#QqC1 z9NfVFWJt?)q9dL>k0|b8;JXjcGkEM%n63tnI4bBi5bgKL3(_JkaN#02@0rgjT&HA1 z?8vo5xTP=YPb3R|B%%c_I{alo$cc1?$t-iRWKm&^%p8jn6`iw4XHH(a5o4#ZvMk~m zn@d($DHykmvkQL3obE9gJc^|KpN;BorspdeIkqr5WjwpOh^3K@NwCUUs*PkS&B3Q~ zm9@l4lX0ik5*&DB<3*80<5|wFoz}Q!Ovp$Z?zCy_;U%YZ#+3Dja-&jiRC0x=7e&Gr z+OSwAxips9B8oAP+O&*fJ!2QKg40wjV+X-{BMMkB(mDuRWh{z$wp7`YDQDqE%-0HR z&N;FIj&HG8^VjocPBqI58^7(wBQ{Q@i^sEP^&d9Uxt#4XKB|n2Mr;k(Aw({O6yq`b za`ajCX`FMzQ)X2H85{!x%u0v!%}z}L#t@nDxn^sg6hOIUvx&~&lUlG$H|h3ZF{e8N z^R(tF;q#=*odoU|yhxCwngX~3&J0&pGX6FrV|fV~JSj4#Qu)0x+RR4&UfH&eN9Q+K z+1DSQVu2tyfW#r2Py@HiadPu7jA6UnTS~{BGi7J$HBt_~gPocet}lkF!sfhZG7!=b#qa&B*N4d%$&kL1^$4})G^@M+QdE|Z9^D@zMp4d@-Ro(^P(^@V~ zLGGa~~Xp5Qw>~2XH`-7M6d$4e1MOT5KOR^1C;f8D}B_aT6hS#6|0L3Cv zADO&pa?_}x(W&QcWYFeh*fI#9>`tdbMQ%DRdr$y%n#vB(bD0SUJdE6>kGYx-@t;0c zW)sE-aAKh`5E7WXFh{s-2Ik1a$G|H1Tj(%?0_foS;}e$_}s83+A0WjzLroVw!=zvWT z{z`wL8)%Sl`q7520IG-Ey8ivaF={*GN!=8XUr4OS+7x&t7QOI?kxoGEi-a$shgRZ5MwFD9Y^|TJ?A>6F0wB3aY?a?kZ@1kA$d`Kt5 yy>j2hMsfi?&LFu}sxaNY8Vu6!f7o&N#%K5IREr{!-(aD5H~p{^_U?Dv-S&SaH2X;a literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/parser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2424b4cde59c913d54750810082e94610dafa7b3 GIT binary patch literal 11433 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc b/venv/lib/python3.6/site-packages/click/__pycache__/testing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..938b408af02cf19c2a93cfce37f75735873776a4 GIT binary patch literal 11586 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 =RzIwY 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%0D@f4MZ+6x`Y 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 cmd_param.nargs: + break + if start_of_option(arg_str): + last_option = arg_str + + return True if last_option and last_option in cmd_param.opts else False + + +def is_incomplete_argument(current_params, cmd_param): + """ + :param current_params: the current params and values for this argument as already entered + :param cmd_param: the current command parameter + :return: whether or not the last argument is incomplete and corresponds to this cmd_param. In + other words whether or not the this cmd_param argument can still accept values + """ + if not isinstance(cmd_param, Argument): + return False + current_param_values = current_params[cmd_param.name] + if current_param_values is None: + return True + if cmd_param.nargs == -1: + return True + if isinstance(current_param_values, abc.Iterable) \ + and cmd_param.nargs > 1 and len(current_param_values) < cmd_param.nargs: + return True + return False + + +def get_user_autocompletions(ctx, args, incomplete, cmd_param): + """ + :param ctx: context associated with the parsed command + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :param cmd_param: command definition + :return: all the possible user-specified completions for the param + """ + results = [] + if isinstance(cmd_param.type, Choice): + # Choices don't support descriptions. + results = [(c, None) + for c in cmd_param.type.choices if str(c).startswith(incomplete)] + elif cmd_param.autocompletion is not None: + dynamic_completions = cmd_param.autocompletion(ctx=ctx, + args=args, + incomplete=incomplete) + results = [c if isinstance(c, tuple) else (c, None) + for c in dynamic_completions] + return results + + +def get_visible_commands_starting_with(ctx, starts_with): + """ + :param ctx: context associated with the parsed command + :starts_with: string that visible commands must start with. + :return: all visible (not hidden) commands that start with starts_with. + """ + for c in ctx.command.list_commands(ctx): + if c.startswith(starts_with): + command = ctx.command.get_command(ctx, c) + if not command.hidden: + yield command + + +def add_subcommand_completions(ctx, incomplete, completions_out): + # Add subcommand completions. + if isinstance(ctx.command, MultiCommand): + completions_out.extend( + [(c.name, c.get_short_help_str()) for c in get_visible_commands_starting_with(ctx, incomplete)]) + + # Walk up the context list and add any other completion possibilities from chained commands + while ctx.parent is not None: + ctx = ctx.parent + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + remaining_commands = [c for c in get_visible_commands_starting_with(ctx, incomplete) + if c.name not in ctx.protected_args] + completions_out.extend([(c.name, c.get_short_help_str()) for c in remaining_commands]) + + +def get_choices(cli, prog_name, args, incomplete): + """ + :param cli: command definition + :param prog_name: the program that is running + :param args: full list of args + :param incomplete: the incomplete text to autocomplete + :return: all the possible completions for the incomplete + """ + all_args = copy.deepcopy(args) + + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return [] + + # In newer versions of bash long opts with '='s are partitioned, but it's easier to parse + # without the '=' + if start_of_option(incomplete) and WORDBREAK in incomplete: + partition_incomplete = incomplete.partition(WORDBREAK) + all_args.append(partition_incomplete[0]) + incomplete = partition_incomplete[2] + elif incomplete == WORDBREAK: + incomplete = '' + + completions = [] + if start_of_option(incomplete): + # completions for partial options + for param in ctx.command.params: + if isinstance(param, Option) and not param.hidden: + param_opts = [param_opt for param_opt in param.opts + + param.secondary_opts if param_opt not in all_args or param.multiple] + completions.extend([(o, param.help) for o in param_opts if o.startswith(incomplete)]) + return completions + # completion for option values from user supplied values + for param in ctx.command.params: + if is_incomplete_option(all_args, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + # completion for argument values from user supplied values + for param in ctx.command.params: + if is_incomplete_argument(ctx.params, param): + return get_user_autocompletions(ctx, all_args, incomplete, param) + + add_subcommand_completions(ctx, incomplete, completions) + # Sort before returning so that proper ordering can be enforced in custom types. + return sorted(completions) + + +def do_complete(cli, prog_name, include_descriptions): + cwords = split_arg_string(os.environ['COMP_WORDS']) + cword = int(os.environ['COMP_CWORD']) + args = cwords[1:cword] + try: + incomplete = cwords[cword] + except IndexError: + incomplete = '' + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item[0]) + if include_descriptions: + # ZSH has trouble dealing with empty array parameters when returned from commands, so use a well defined character '_' to indicate no description is present. + echo(item[1] if item[1] else '_') + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if complete_instr.startswith('source'): + shell = 'zsh' if complete_instr == 'source_zsh' else 'bash' + echo(get_completion_script(prog_name, complete_var, shell)) + return True + elif complete_instr == 'complete' or complete_instr == 'complete_zsh': + return do_complete(cli, prog_name, complete_instr == 'complete_zsh') + return False diff --git a/venv/lib/python3.6/site-packages/click/_compat.py b/venv/lib/python3.6/site-packages/click/_compat.py new file mode 100644 index 0000000..937e230 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/_compat.py @@ -0,0 +1,703 @@ +import re +import io +import os +import sys +import codecs +from weakref import WeakKeyDictionary + + +PY2 = sys.version_info[0] == 2 +CYGWIN = sys.platform.startswith('cygwin') +# Determine local App Engine environment, per Google's own suggestion +APP_ENGINE = ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) +WIN = sys.platform.startswith('win') and not APP_ENGINE +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile(r'\033\[((?:\d|;)*)([a-zA-Z])') + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream(stream, encoding, errors, + force_readable=False, force_writable=False): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = 'replace' + return _NonClosingTextIOWrapper(stream, encoding, errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable) + + +def is_ascii_encoding(encoding): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == 'ascii' + except LookupError: + return False + + +def get_best_encoding(stream): + """Returns the default stream encoding if not found.""" + rv = getattr(stream, 'encoding', None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return 'utf-8' + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + + def __init__(self, stream, encoding, errors, + force_readable=False, force_writable=False, **extra): + self._stream = stream = _FixupStream(stream, force_readable, + force_writable) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__(self, stream, force_readable=False, force_writable=False): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, 'read1', None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + if self._force_readable: + return True + x = getattr(self._stream, 'readable', None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + if self._force_writable: + return True + x = getattr(self._stream, 'writable', None) + if x is not None: + return x() + try: + self._stream.write('') + except Exception: + try: + self._stream.write(b'') + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, 'seekable', None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + bytes = str + raw_input = raw_input + string_types = (str, unicode) + int_types = (int, long) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$') + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + def set_binary_mode(f): + return f + + try: + import msvcrt + except ImportError: + pass + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + try: + import fcntl + except ImportError: + pass + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + flags = fcntl.fcntl(fileno, fcntl.F_GETFL) + fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + _wrap_std_stream('stdout') + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + _wrap_std_stream('stderr') + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors, + force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + _wrap_std_stream('stdout') + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors, + force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + _wrap_std_stream('stderr') + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors, + force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + return value +else: + import io + text_type = str + raw_input = input + string_types = (str,) + int_types = (int,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + def _is_binary_writer(stream, default=False): + try: + stream.write(b'') + except Exception: + try: + stream.write('') + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return buf + + def _stream_is_misconfigured(stream): + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, 'encoding', None) or 'ascii') + + def _is_compatible_text_stream(stream, encoding, errors): + stream_encoding = getattr(stream, 'encoding', None) + stream_errors = getattr(stream, 'errors', None) + + # Perfect match. + if stream_encoding == encoding and stream_errors == errors: + return True + + # Otherwise, it's only a compatible stream if we did not ask for + # an encoding. + if encoding is None: + return stream_encoding is not None + + return False + + def _force_correct_text_reader(text_reader, encoding, errors, + force_readable=False): + if _is_binary_reader(text_reader, False): + binary_reader = text_reader + else: + # If there is no target encoding set, we need to verify that the + # reader is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_reader): + return text_reader + + if _is_compatible_text_stream(text_reader, encoding, errors): + return text_reader + + # If the reader has no encoding, we try to find the underlying + # binary reader for it. If that fails because the environment is + # misconfigured, we silently go with the same reader because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_reader = _find_binary_reader(text_reader) + if binary_reader is None: + return text_reader + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_reader, encoding, errors, + force_readable=force_readable) + + def _force_correct_text_writer(text_writer, encoding, errors, + force_writable=False): + if _is_binary_writer(text_writer, False): + binary_writer = text_writer + else: + # If there is no target encoding set, we need to verify that the + # writer is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_writer): + return text_writer + + if _is_compatible_text_stream(text_writer, encoding, errors): + return text_writer + + # If the writer has no encoding, we try to find the underlying + # binary writer for it. If that fails because the environment is + # misconfigured, we silently go with the same writer because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_writer = _find_binary_writer(text_writer) + if binary_writer is None: + return text_writer + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_writer, encoding, errors, + force_writable=force_writable) + + def get_binary_stdin(): + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdin.') + return reader + + def get_binary_stdout(): + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdout.') + return writer + + def get_binary_stderr(): + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stderr.') + return writer + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, + force_readable=True) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, + force_writable=True) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, + force_writable=True) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + else: + value = value.encode('utf-8', 'surrogateescape') \ + .decode('utf-8', 'replace') + return value + + +def get_streerror(e, default=None): + if hasattr(e, 'strerror'): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode('utf-8', 'replace') + return msg + + +def open_stream(filename, mode='r', encoding=None, errors='strict', + atomic=False): + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == '-': + if any(m in mode for m in ['w', 'a', 'x']): + if 'b' in mode: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if 'b' in mode: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + if encoding is None: + return open(filename, mode), True + return io.open(filename, mode, encoding=encoding, errors=errors), True + + # Some usability stuff for atomic writes + if 'a' in mode: + raise ValueError( + 'Appending to an existing file is not supported, because that ' + 'would involve an expensive `copy`-operation to a temporary ' + 'file. Open the file in normal `w`-mode and copy explicitly ' + 'if that\'s what you\'re after.' + ) + if 'x' in mode: + raise ValueError('Use the `overwrite`-parameter instead.') + if 'w' not in mode: + raise ValueError('Atomic writes only make sense with `w`-mode.') + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import tempfile + fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename), + prefix='.__atomic-write') + + if encoding is not None: + f = io.open(fd, mode, encoding=encoding, errors=errors) + else: + f = os.fdopen(fd, mode) + + return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, 'replace'): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub('', value) + + +def should_strip_ansi(stream=None, color=None): + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) + return not color + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream, _wrap_std_stream + + def _get_argv_encoding(): + import locale + return locale.getpreferredencoding() + + if PY2: + def raw_input(prompt=''): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip('\r\n') + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT).srWindow + return win.Right - win.Left, win.Bottom - win.Top +else: + def _get_argv_encoding(): + return getattr(sys.stdin, 'encoding', None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + _wrap_std_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + def func(): + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + stream = src_func() # In case wrapper_func() modified the stream + cache[stream] = rv + except Exception: + pass + return rv + return func + + +_default_text_stdin = _make_cached_stream_func( + lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func( + lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func( + lambda: sys.stderr, get_text_stderr) + + +binary_streams = { + 'stdin': get_binary_stdin, + 'stdout': get_binary_stdout, + 'stderr': get_binary_stderr, +} + +text_streams = { + 'stdin': get_text_stdin, + 'stdout': get_text_stdout, + 'stderr': get_text_stderr, +} diff --git a/venv/lib/python3.6/site-packages/click/_termui_impl.py b/venv/lib/python3.6/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..00a8e5e --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/_termui_impl.py @@ -0,0 +1,621 @@ +# -*- coding: utf-8 -*- +""" +click._termui_impl +~~~~~~~~~~~~~~~~~~ + +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. + +:copyright: © 2014 by the Pallets team. +:license: BSD, see LICENSE.rst for more details. +""" + +import os +import sys +import time +import math +import contextlib +from ._compat import _default_text_stdout, range_type, PY2, isatty, \ + open_stream, strip_ansi, term_len, get_best_encoding, WIN, int_types, \ + CYGWIN +from .utils import echo +from .exceptions import ClickException + + +if os.name == 'nt': + BEFORE_BAR = '\r' + AFTER_BAR = '\n' +else: + BEFORE_BAR = '\r\033[?25l' + AFTER_BAR = '\033[?25h\n' + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or \ + not isinstance(hint, int_types) or \ + hint < 0: + return None + return hint + + +class ProgressBar(object): + + def __init__(self, iterable, length=None, fill_char='#', empty_char=' ', + bar_template='%(bar)s', info_sep=' ', show_eta=True, + show_percent=None, show_pos=False, item_show_func=None, + label=None, file=None, color=None, width=30): + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or '' + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError('iterable or length is required') + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + self.short_limit = 0.5 + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + self.render_progress() + return self.generator() + + def is_fast(self): + return time.time() - self.start <= self.short_limit + + def render_finish(self): + if self.is_hidden or self.is_fast(): + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + days = t + return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + return '' + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += '/%s' % self.length + return pos + + def format_pct(self): + return ('% 4d%%' % int(self.pct * 100))[1:] + + def format_bar(self): + if self.length_known: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[int((math.cos(self.pos * self.time_per_iteration) + / 2.0 + 0.5) * self.width)] = self.fill_char + bar = ''.join(bar) + return bar + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return (self.bar_template % { + 'label': self.label, + 'bar': self.format_bar(), + 'info': self.info_sep.join(info_bits) + }).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + + if self.is_hidden: + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(' ' * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(' ' * (clear_width - line_len)) + line = ''.join(buf) + # Render the line only if it changed. + + if line != self._last_line and not self.is_fast(): + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def generator(self): + """ + Returns a generator which yields the items added to the bar during + construction, and updates the progress bar *after* the yielded block + returns. + """ + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + + if self.is_hidden: + for rv in self.iter: + yield rv + else: + for rv in self.iter: + self.current_item = rv + yield rv + self.update(1) + self.finish() + self.render_progress() + + +def pager(generator, color=None): + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get('PAGER', None) or '').strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith('os2'): + return _tempfilepager(generator, 'more <', color) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return _pipepager(generator, 'less', color) + + import tempfile + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: + return _pipepager(generator, 'more', color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator, cmd, color): + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit('/', 1)[-1].split() + if color is None and cmd_detail[0] == 'less': + less_flags = os.environ.get('LESS', '') + ' '.join(cmd_detail[1:]) + if not less_flags: + env['LESS'] = '-R' + color = True + elif 'r' in less_flags or 'R' in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + env=env) + encoding = get_best_encoding(c.stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + c.stdin.write(text.encode(encoding, 'replace')) + except (IOError, KeyboardInterrupt): + pass + else: + c.stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager(generator, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, 'wb')[0] as f: + f.write(text.encode(encoding)) + try: + os.system(cmd + ' "' + filename + '"') + finally: + os.unlink(filename) + + +def _nullpager(stream, generator, color): + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor(object): + + def __init__(self, editor=None, env=None, require_save=True, + extension='.txt'): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + if self.editor is not None: + return self.editor + for key in 'VISUAL', 'EDITOR': + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return 'notepad' + for editor in 'vim', 'nano': + if os.system('which %s >/dev/null 2>&1' % editor) == 0: + return editor + return 'vi' + + def edit_file(self, filename): + import subprocess + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen('%s "%s"' % (editor, filename), + env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException('%s: Editing failed!' % editor) + except OSError as e: + raise ClickException('%s: Editing failed: %s' % (editor, e)) + + def edit(self, text): + import tempfile + + text = text or '' + if text and not text.endswith('\n'): + text += '\n' + + fd, name = tempfile.mkstemp(prefix='editor-', suffix=self.extension) + try: + if WIN: + encoding = 'utf-8-sig' + text = text.replace('\n', '\r\n') + else: + encoding = 'utf-8' + text = text.encode(encoding) + + f = os.fdopen(fd, 'wb') + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save \ + and os.path.getmtime(name) == timestamp: + return None + + f = open(name, 'rb') + try: + rv = f.read() + finally: + f.close() + return rv.decode('utf-8-sig').replace('\r\n', '\n') + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith('file://'): + url = urllib.unquote(url[7:]) + return url + + if sys.platform == 'darwin': + args = ['open'] + if wait: + args.append('-W') + if locate: + args.append('-R') + args.append(_unquote_file(url)) + null = open('/dev/null', 'w') + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = 'explorer /select,"%s"' % _unquote_file( + url.replace('"', '')) + else: + args = 'start %s "" "%s"' % ( + wait and '/WAIT' or '', url.replace('"', '')) + return os.system(args) + elif CYGWIN: + if locate: + url = _unquote_file(url) + args = 'cygstart "%s"' % (os.path.dirname(url).replace('"', '')) + else: + args = 'cygstart %s "%s"' % ( + wait and '-w' or '', url.replace('"', '')) + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or '.' + else: + url = _unquote_file(url) + c = subprocess.Popen(['xdg-open', url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(('http://', 'https://')) and not locate and not wait: + import webbrowser + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch): + if ch == u'\x03': + raise KeyboardInterrupt() + if ch == u'\x04' and not WIN: # Unix-like, Ctrl+D + raise EOFError() + if ch == u'\x1a' and WIN: # Windows, Ctrl+Z + raise EOFError() + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal(): + yield + + def getchar(echo): + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + if echo: + func = msvcrt.getwche + else: + func = msvcrt.getwch + + rv = func() + if rv in (u'\x00', u'\xe0'): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + _translate_ch_to_exc(rv) + return rv +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal(): + if not isatty(sys.stdin): + f = open('/dev/tty') + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + try: + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo): + with raw_terminal() as fd: + ch = os.read(fd, 32) + ch = ch.decode(get_best_encoding(sys.stdin), 'replace') + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + _translate_ch_to_exc(ch) + return ch diff --git a/venv/lib/python3.6/site-packages/click/_textwrap.py b/venv/lib/python3.6/site-packages/click/_textwrap.py new file mode 100644 index 0000000..7e77603 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/_textwrap.py @@ -0,0 +1,38 @@ +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + + def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent): + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text): + rv = [] + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + if idx > 0: + indent = self.subsequent_indent + rv.append(indent + line) + return '\n'.join(rv) diff --git a/venv/lib/python3.6/site-packages/click/_unicodefun.py b/venv/lib/python3.6/site-packages/click/_unicodefun.py new file mode 100644 index 0000000..620edff --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/_unicodefun.py @@ -0,0 +1,125 @@ +import os +import sys +import codecs + +from ._compat import PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +click = sys.modules[__name__.rsplit('.', 1)[0]] + + +def _find_unicode_literals_frame(): + import __future__ + if not hasattr(sys, '_getframe'): # not all Python implementations have it + return 0 + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get('__name__', '').startswith('click.'): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + if not PY2 or click.disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + warn(Warning('Click detected the use of the unicode_literals ' + '__future__ import. This is heavily discouraged ' + 'because it can introduce subtle bugs in your ' + 'code. You should instead use explicit u"" literals ' + 'for your unicode strings. For more information see ' + 'https://click.palletsprojects.com/python3/'), + stacklevel=bad_frame) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = 'ascii' + if fs_enc != 'ascii': + return + + extra = '' + if os.name == 'posix': + import subprocess + try: + rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()[0] + except OSError: + rv = b'' + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode('ascii', 'replace') + + for line in rv.splitlines(): + locale = line.strip() + if locale.lower().endswith(('.utf-8', '.utf8')): + good_locales.add(locale) + if locale.lower() in ('c.utf8', 'c.utf-8'): + has_c_utf8 = True + + extra += '\n\n' + if not good_locales: + extra += ( + 'Additional information: on this system no suitable UTF-8\n' + 'locales were discovered. This most likely requires resolving\n' + 'by reconfiguring the locale system.' + ) + elif has_c_utf8: + extra += ( + 'This system supports the C.UTF-8 locale which is recommended.\n' + 'You might be able to resolve your issue by exporting the\n' + 'following environment variables:\n\n' + ' export LC_ALL=C.UTF-8\n' + ' export LANG=C.UTF-8' + ) + else: + extra += ( + 'This system lists a couple of UTF-8 supporting locales that\n' + 'you can pick from. The following suitable locales were\n' + 'discovered: %s' + ) % ', '.join(sorted(good_locales)) + + bad_locale = None + for locale in os.environ.get('LC_ALL'), os.environ.get('LANG'): + if locale and locale.lower().endswith(('.utf-8', '.utf8')): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + '\n\nClick discovered that you exported a UTF-8 locale\n' + 'but the locale system could not pick up from it because\n' + 'it does not exist. The exported locale is "%s" but it\n' + 'is not supported' + ) % bad_locale + + raise RuntimeError( + 'Click will abort further execution because Python 3 was' + ' configured to use ASCII as encoding for the environment.' + ' Consult https://click.palletsprojects.com/en/7.x/python3/ for' + ' mitigation steps.' + extra + ) diff --git a/venv/lib/python3.6/site-packages/click/_winconsole.py b/venv/lib/python3.6/site-packages/click/_winconsole.py new file mode 100644 index 0000000..bbb080d --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/_winconsole.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prmopt. + +import io +import os +import sys +import zlib +import time +import ctypes +import msvcrt +from ._compat import _NonClosingTextIOWrapper, text_type, PY2 +from ctypes import byref, POINTER, c_int, c_char, c_char_p, \ + c_void_p, py_object, c_ssize_t, c_ulong, windll, WINFUNCTYPE +try: + from ctypes import pythonapi + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None +from ctypes.wintypes import LPWSTR, LPCWSTR + + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)( + ('GetCommandLineW', windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE( + POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ('CommandLineToArgvW', windll.shell32)) + + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b'\x1a' +MAX_BYTES_WRITTEN = 32767 + + +class Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', py_object), + ('len', c_ssize_t), + ('itemsize', c_ssize_t), + ('readonly', c_int), + ('ndim', c_int), + ('format', c_char_p), + ('shape', c_ssize_p), + ('strides', c_ssize_p), + ('suboffsets', c_ssize_p), + ('internal', c_void_p) + ] + + if PY2: + _fields_.insert(-1, ('smalltable', c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + + def __init__(self, handle): + self.handle = handle + + def isatty(self): + io.RawIOBase.isatty(self) + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError('cannot read odd number of bytes from ' + 'UTF-16-LE encoded console') + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW(self.handle, buffer, code_units_to_be_read, + byref(code_units_read), None) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError('Windows error: %s' % GetLastError()) + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return 'ERROR_SUCCESS' + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return 'ERROR_NOT_ENOUGH_MEMORY' + return 'Windows error %s' % errno + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, + MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW(self.handle, buf, code_units_to_be_written, + byref(code_units_written), None) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream(object): + + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return '' % ( + self.name, + self.encoding, + ) + + +class WindowsChunkedWriter(object): + """ + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()' which we wrap to write in + limited chunks due to a Windows limitation on binary console streams. + """ + def __init__(self, wrapped): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + total_to_write = len(text) + written = 0 + + while written < total_to_write: + to_write = min(total_to_write - written, MAX_BYTES_WRITTEN) + self.__wrapped.write(text[written:written+to_write]) + written += to_write + + +_wrapped_std_streams = set() + + +def _wrap_std_stream(name): + # Python 2 & Windows 7 and below + if PY2 and sys.getwindowsversion()[:2] <= (6, 1) and name not in _wrapped_std_streams: + setattr(sys, name, WindowsChunkedWriter(getattr(sys, name))) + _wrapped_std_streams.add(name) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + def _hash_py_argv(): + return zlib.crc32('\x00'.join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + argv = [argv_unicode[i] for i in range(0, argc.value)] + + if not hasattr(sys, 'frozen'): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith('-') or arg == '-': + break + argv = argv[1:] + if arg.startswith(('-c', '-m')): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _get_windows_console_stream(f, encoding, errors): + if get_buffer is not None and \ + encoding in ('utf-16-le', None) \ + and errors in ('strict', None) and \ + hasattr(f, 'isatty') and f.isatty(): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, 'buffer', None) + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/venv/lib/python3.6/site-packages/click/core.py b/venv/lib/python3.6/site-packages/click/core.py new file mode 100644 index 0000000..7a1e342 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/core.py @@ -0,0 +1,1856 @@ +import errno +import inspect +import os +import sys +from contextlib import contextmanager +from itertools import repeat +from functools import update_wrapper + +from .types import convert_type, IntRange, BOOL +from .utils import PacifyFlushWrapper, make_str, make_default_short_help, \ + echo, get_os_args +from .exceptions import ClickException, UsageError, BadParameter, Abort, \ + MissingParameter, Exit +from .termui import prompt, confirm, style +from .formatting import HelpFormatter, join_options +from .parser import OptionParser, split_opt +from .globals import push_context, pop_context + +from ._compat import PY2, isidentifier, iteritems, string_types +from ._unicodefun import _check_for_unicode_literals, _verify_python3_env + + +_missing = object() + + +SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' +SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' + +DEPRECATED_HELP_NOTICE = ' (DEPRECATED)' +DEPRECATED_INVOKE_NOTICE = 'DeprecationWarning: ' + \ + 'The command %(name)s is deprecated.' + + +def _maybe_show_deprecated_notice(cmd): + if cmd.deprecated: + echo(style(DEPRECATED_INVOKE_NOTICE % {'name': cmd.name}, fg='red'), err=True) + + +def fast_exit(code): + """Exit without garbage collection, this speeds up exit by about 10ms for + things like bash completion. + """ + sys.stdout.flush() + sys.stderr.flush() + os._exit(code) + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = '_%s_COMPLETE' % (prog_name.replace('-', '_')).upper() + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + fast_exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = 'It is not possible to add multi commands as children to ' \ + 'another multi command that is in chain mode' + else: + hint = 'Found a multi command as subcommand to a multi command ' \ + 'that is in chain mode. This is not supported' + raise RuntimeError('%s. Command "%s" is set to chain and "%s" was ' + 'added as subcommand but it in itself is a ' + 'multi command. ("%s" is a %s within a chained ' + '%s named "%s").' % ( + hint, base_command.name, cmd_name, + cmd_name, cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name)) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, '__code__', None) + args = getattr(code, 'co_argcount', 3) + + if args < 3: + # This will become a warning in Click 3.0: + from warnings import warn + warn(Warning('Invoked legacy parameter callback "%s". The new ' + 'signature for such callbacks starting with ' + 'click 2.0 is (ctx, param, value).' + % callback), stacklevel=3) + return callback(ctx, value) + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=None): + """Context manager that attaches extra information to exceptions that + fly. + """ + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing(invocation_order, declaration_order): + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + def sort_key(item): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float('inf') + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + """ + + def __init__(self, command, parent=None, info_name=None, obj=None, + auto_envvar_prefix=None, default_map=None, + terminal_width=None, max_content_width=None, + resilient_parsing=False, allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, help_option_names=None, + token_normalize_func=None, color=None): + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, 'meta', {}) + + #: A dictionary (-like object) with defaults for parameters. + if default_map is None \ + and parent is not None \ + and parent.default_map is not None: + default_map = parent.default_map.get(info_name) + self.default_map = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`resultcallback`. + self.invoked_subcommand = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + #: The width of the terminal (None is autodetection). + self.terminal_width = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ['--help'] + + #: The names for the help options. + self.help_option_names = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if parent is not None \ + and parent.auto_envvar_prefix is not None and \ + self.info_name is not None: + auto_envvar_prefix = '%s_%s' % (parent.auto_envvar_prefix, + self.info_name.upper()) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + self.auto_envvar_prefix = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color = color + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self): + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = __name__ + '.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self): + """Creates the formatter for the help and usage output.""" + return HelpFormatter(width=self.terminal_width, + max_width=self.max_content_width) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = '' + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + rv = self.parent.command_path + ' ' + rv + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError('The given command does not have a ' + 'callback that can be invoked.') + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + if not isinstance(cmd, Command): + raise TypeError('Callback is not a command.') + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, **kwargs) + + +class BaseCommand(object): + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__(self, name, context_settings=None): + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + if context_settings is None: + context_settings = {} + #: an optional dictionary with defaults passed to the context. + self.context_settings = context_settings + + def get_usage(self, ctx): + raise NotImplementedError('Base commands cannot get usage') + + def get_help(self, ctx): + raise NotImplementedError('Base commands cannot get help') + + def make_context(self, info_name, args, parent=None, **extra): + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + :param info_name: the info name for this invokation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it it's + the name of the script. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(self, info_name=info_name, parent=parent, **extra) + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx, args): + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError('Base commands do not know how to parse ' + 'arguments.') + + def invoke(self, ctx): + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError('Base commands are not invokable by default') + + def main(self, args=None, prog_name=None, complete_var=None, + standalone_mode=True, **extra): + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point or reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str(os.path.basename( + sys.argv and sys.argv[0] or __file__)) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt): + echo(file=sys.stderr) + raise Abort() + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.stdout = PacifyFlushWrapper(sys.stdout) + sys.stderr = PacifyFlushWrapper(sys.stderr) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo('Aborted!', file=sys.stderr) + sys.exit(1) + + def __call__(self, *args, **kwargs): + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + """ + + def __init__(self, name, context_settings=None, callback=None, + params=None, help=None, epilog=None, short_help=None, + options_metavar='[OPTIONS]', add_help_option=True, + hidden=False, deprecated=False): + BaseCommand.__init__(self, name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params = params or [] + # if a form feed (page break) is found in the help text, truncate help + # text to the content preceding the first form feed + if help and '\f' in help: + help = help.split('\f', 1)[0] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.hidden = hidden + self.deprecated = deprecated + + def get_usage(self, ctx): + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_params(self, ctx): + rv = self.params + help_option = self.get_help_option(ctx) + if help_option is not None: + rv = rv + [help_option] + return rv + + def format_usage(self, ctx, formatter): + """Writes the usage line into the formatter.""" + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, ' '.join(pieces)) + + def collect_usage_pieces(self, ctx): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + return Option(help_options, is_flag=True, + is_eager=True, expose_value=False, + callback=show_help, + help='Show this message and exit.') + + def make_parser(self, ctx): + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx): + """Formats the help into a string and returns it. This creates a + formatter and will call into the following formatting methods: + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_short_help_str(self, limit=45): + """Gets short help for the command or makes it by shortening the long help string.""" + return self.short_help or self.help and make_default_short_help(self.help, limit) or '' + + def format_help(self, ctx, formatter): + """Writes the help into the formatter if it exists. + + This calls into the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + help_text = self.help + if self.deprecated: + help_text += DEPRECATED_HELP_NOTICE + formatter.write_text(help_text) + elif self.deprecated: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(DEPRECATED_HELP_NOTICE) + + def format_options(self, ctx, formatter): + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section('Options'): + formatter.write_dl(opts) + + def format_epilog(self, ctx, formatter): + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx, args): + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing( + param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail('Got unexpected extra argument%s (%s)' + % (len(args) != 1 and 's' or '', + ' '.join(map(make_str, args)))) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + _maybe_show_deprecated_notice(self) + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: the result callback to attach to this multi + command. + """ + allow_extra_args = True + allow_interspersed_args = False + + def __init__(self, name=None, invoke_without_command=False, + no_args_is_help=None, subcommand_metavar=None, + chain=False, result_callback=None, **attrs): + Command.__init__(self, name, **attrs) + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + if subcommand_metavar is None: + if chain: + subcommand_metavar = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` decorator. + self.result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError('Multi commands in chain mode cannot ' + 'have optional arguments.') + + def collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), + *args, **kwargs) + self.result_callback = rv = update_wrapper(function, f) + return rv + return decorator + + def format_commands(self, ctx, formatter): + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section('Commands'): + formatter.write_dl(rows) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, ctx, args) + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, + **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + ctx.fail('Missing command.') + + # Fetch args back out + args = ctx.protected_args + ctx.args + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = args and '*' or None + Command.invoke(self, ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command(self, ctx, args): + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail('No such command "%s".' % original_cmd_name) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError() + + def list_commands(self, ctx): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=None): + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError('Command has no name.') + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__(self, name=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + return rv + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. In Click 2.0, the old callback format will still work, + but it will raise a warning to give you change to migrate the + code easier. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The later is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: a callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. Before Click + 2.0, the signature was ``(ctx, value)``. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + """ + param_type_name = 'parameter' + + def __init__(self, param_decls=None, type=None, required=False, + default=None, callback=None, nargs=None, metavar=None, + expose_value=True, is_eager=False, envvar=None, + autocompletion=None): + self.name, self.opts, self.secondary_opts = \ + self._parse_decls(param_decls or (), expose_value) + + self.type = convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + self.autocompletion = autocompletion + + @property + def human_readable_name(self): + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + metavar = self.type.get_metavar(self) + if metavar is None: + metavar = self.type.name.upper() + if self.nargs != 1: + metavar += '...' + return metavar + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = self.value_from_envvar(ctx) + if value is None: + value = ctx.lookup_default(self.name) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError('Attempted to invoke composite type ' + 'but nargs has been set to %s. This is ' + 'not supported; nargs needs to be set to ' + 'a fixed value > 1.' % self.nargs) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None and not ctx.resilient_parsing: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + return os.environ.get(self.envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + return rv + + def handle_parse_result(self, ctx, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback( + self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + def get_error_hint(self, ctx): + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return ' / '.join('"%s"' % x for x in hint_list) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: controls if the default value should be shown on the + help page. Normally, defaults are not shown. If this + value is a string, it shows the string instead of the + value. This is particularly useful for dynamic options. + :param show_envvar: controls if an environment variable should be shown on + the help page. Normally, environment variables + are not shown. + :param prompt: if set to `True` or a non empty string then the user will be + prompted for input. If set to `True` the prompt will be the + option name capitalized. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :param hide_input: if this is `True` then the input on the prompt will be + hidden from the user. This is useful for password + input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + """ + param_type_name = 'option' + + def __init__(self, param_decls=None, show_default=False, + prompt=False, confirmation_prompt=False, + hide_input=False, is_flag=None, flag_value=None, + multiple=False, count=False, allow_from_autoenv=True, + type=None, help=None, hidden=False, show_choices=True, + show_envvar=False, **attrs): + default_is_missing = attrs.get('default', _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace('_', ' ').capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + self.hidden = hidden + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) \ + and type is None: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError('Options cannot have nargs < 0') + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError('Cannot prompt for flags that are not bools.') + if not self.is_bool_flag and self.secondary_opts: + raise TypeError('Got secondary option for non boolean flag.') + if self.is_bool_flag and self.hide_input \ + and self.prompt is not None: + raise TypeError('Hidden input does not work with boolean ' + 'flag prompts.') + if self.count: + if self.multiple: + raise TypeError('Options cannot be multiple and count ' + 'at the same time.') + elif self.is_flag: + raise TypeError('Options cannot be count and flags at ' + 'the same time.') + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError('Name defined twice') + name = decl + else: + split_char = decl[:1] == '/' and ';' or '/' + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace('-', '_').lower() + if not isidentifier(name): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError('Could not determine name for option') + + if not opts and not secondary_opts: + raise TypeError('No options defined but a name was passed (%s). ' + 'Did you mean to declare an argument instead ' + 'of an option?' % name) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + 'dest': self.name, + 'nargs': self.nargs, + 'obj': self, + } + + if self.multiple: + action = 'append' + elif self.count: + action = 'count' + else: + action = 'store' + + if self.is_flag: + kwargs.pop('nargs', None) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action + '_const', + const=True, **kwargs) + parser.add_option(self.secondary_opts, action=action + + '_const', const=False, **kwargs) + else: + parser.add_option(self.opts, action=action + '_const', + const=self.flag_value, + **kwargs) + else: + kwargs['action'] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + if self.hidden: + return + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += ' ' + self.make_metavar() + return rv + + rv = [_write_opts(self.opts)] + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or '' + extra = [] + if self.show_envvar: + envvar = self.envvar + if envvar is None: + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + if envvar is not None: + extra.append('env var: %s' % ( + ', '.join('%s' % d for d in envvar) + if isinstance(envvar, (list, tuple)) + else envvar, )) + if self.default is not None and self.show_default: + if isinstance(self.show_default, string_types): + default_string = '({})'.format(self.show_default) + elif isinstance(self.default, (list, tuple)): + default_string = ', '.join('%s' % d for d in self.default) + elif inspect.isfunction(self.default): + default_string = "(dynamic)" + else: + default_string = self.default + extra.append('default: {}'.format(default_string)) + + if self.required: + extra.append('required') + if extra: + help = '%s[%s]' % (help and help + ' ' or '', '; '.join(extra)) + + return ((any_prefix_is_slash and '; ' or ' / ').join(rv), help) + + def get_default(self, ctx): + # If we're a non boolean flag out default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return param.flag_value + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt(self.prompt, default=default, type=self.type, + hide_input=self.hide_input, show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x)) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None \ + and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the parameter constructor. + """ + param_type_name = 'argument' + + def __init__(self, param_decls, required=None, **attrs): + if required is None: + if attrs.get('default') is not None: + required = False + else: + required = attrs.get('nargs', 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError('nargs=-1 in combination with a default value ' + 'is not supported.') + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() + if not self.required: + var = '[%s]' % var + if self.nargs != 1: + var += '...' + return var + + def _parse_decls(self, decls, expose_value): + if not decls: + if not expose_value: + return None, [], [] + raise TypeError('Could not determine name for argument') + if len(decls) == 1: + name = arg = decls[0] + name = name.replace('-', '_').lower() + else: + raise TypeError('Arguments take exactly one ' + 'parameter declaration, got %d' % len(decls)) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def get_error_hint(self, ctx): + return '"%s"' % self.make_metavar() + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, + obj=self) + + +# Circular dependency between decorators and core +from .decorators import command, group diff --git a/venv/lib/python3.6/site-packages/click/decorators.py b/venv/lib/python3.6/site-packages/click/decorators.py new file mode 100644 index 0000000..c57c530 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/decorators.py @@ -0,0 +1,311 @@ +import sys +import inspect + +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .utils import echo +from .globals import get_current_context + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + return update_wrapper(new_func, f) + + +def pass_obj(f): + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + def new_func(*args, **kwargs): + return f(get_current_context().obj, *args, **kwargs) + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + def decorator(f): + def new_func(*args, **kwargs): + ctx = get_current_context() + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + if obj is None: + raise RuntimeError('Managed to invoke callback without a ' + 'context object of type %r existing' + % object_type.__name__) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError('Attempted to convert a callback into a ' + 'command twice.') + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get('help') + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode('utf-8') + else: + help = inspect.cleandoc(help) + attrs['help'] = help + _check_for_unicode_literals() + return cls(name=name or f.__name__.lower().replace('_', '-'), + callback=f, params=params, **attrs) + + +def command(name=None, cls=None, **attrs): + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function. If you + want to change that, you can pass the intended name as the first + argument. + + All keyword arguments are forwarded to the underlying command class. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + return decorator + + +def group(name=None, **attrs): + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + """ + attrs.setdefault('cls', Group) + return command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, '__click_params__'): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + def decorator(f): + ArgumentClass = attrs.pop('cls', Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + return decorator + + +def option(*param_decls, **attrs): + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + def decorator(f): + # Issue 926, copy attrs, so pre-defined options can re-use the same cls= + option_attrs = attrs.copy() + + if 'help' in option_attrs: + option_attrs['help'] = inspect.cleandoc(option_attrs['help']) + OptionClass = option_attrs.pop('cls', Option) + _param_memo(f, OptionClass(param_decls, **option_attrs)) + return f + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + attrs.setdefault('is_flag', True) + attrs.setdefault('callback', callback) + attrs.setdefault('expose_value', False) + attrs.setdefault('prompt', 'Do you want to continue?') + attrs.setdefault('help', 'Confirm the action without prompting.') + return option(*(param_decls or ('--yes',)), **attrs)(f) + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + def decorator(f): + attrs.setdefault('prompt', True) + attrs.setdefault('confirmation_prompt', True) + attrs.setdefault('hide_input', True) + return option(*(param_decls or ('--password',)), **attrs)(f) + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + if hasattr(sys, '_getframe'): + module = sys._getframe(1).f_globals.get('__name__') + else: + module = '' + + def decorator(f): + prog_name = attrs.pop('prog_name', None) + message = attrs.pop('message', '%(prog)s, version %(version)s') + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get('console_scripts') or {} + for script_name, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError('Could not determine version') + echo(message % { + 'prog': prog, + 'version': ver, + }, color=ctx.color) + ctx.exit() + + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('is_eager', True) + attrs.setdefault('help', 'Show the version and exit.') + attrs['callback'] = callback + return option(*(param_decls or ('--version',)), **attrs)(f) + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('help', 'Show this message and exit.') + attrs.setdefault('is_eager', True) + attrs['callback'] = callback + return option(*(param_decls or ('--help',)), **attrs)(f) + return decorator + + +# Circular dependencies between core and decorators +from .core import Command, Group, Argument, Option diff --git a/venv/lib/python3.6/site-packages/click/exceptions.py b/venv/lib/python3.6/site-packages/click/exceptions.py new file mode 100644 index 0000000..6fa1765 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/exceptions.py @@ -0,0 +1,235 @@ +from ._compat import PY2, filename_to_ui, get_text_stderr +from .utils import echo + + +def _join_param_hints(param_hint): + if isinstance(param_hint, (tuple, list)): + return ' / '.join('"%s"' % x for x in param_hint) + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception + exit_code = 1 + + def __init__(self, message): + ctor_msg = message + if PY2: + if ctor_msg is not None: + ctor_msg = ctor_msg.encode('utf-8') + Exception.__init__(self, ctor_msg) + self.message = message + + def format_message(self): + return self.message + + def __str__(self): + return self.message + + if PY2: + __unicode__ = __str__ + + def __str__(self): + return self.message.encode('utf-8') + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo('Error: %s' % self.format_message(), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + exit_code = 2 + + def __init__(self, message, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + self.cmd = self.ctx and self.ctx.command or None + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + hint = '' + if (self.cmd is not None and + self.cmd.get_help_option(self.ctx) is not None): + hint = ('Try "%s %s" for help.\n' + % (self.ctx.command_path, self.ctx.help_option_names[0])) + if self.ctx is not None: + color = self.ctx.color + echo(self.ctx.get_usage() + '\n%s' % hint, file=file, color=color) + echo('Error: %s' % self.format_message(), file=file, color=color) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__(self, message, ctx=None, param=None, + param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + return 'Invalid value: %s' % self.message + param_hint = _join_param_hints(param_hint) + + return 'Invalid value for %s: %s' % (param_hint, self.message) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__(self, message=None, ctx=None, param=None, + param_hint=None, param_type=None): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) + else: + param_hint = None + param_hint = _join_param_hints(param_hint) + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += '. ' + msg_extra + else: + msg = msg_extra + + return 'Missing %s%s%s%s' % ( + param_type, + param_hint and ' %s' % param_hint or '', + msg and '. ' or '.', + msg or '', + ) + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, + ctx=None): + if message is None: + message = 'no such option: %s' % option_name + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append('Did you mean %s?' % self.possibilities[0]) + else: + possibilities = sorted(self.possibilities) + bits.append('(Possible options: %s)' % ', '.join(possibilities)) + return ' '.join(bits) + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__(self, option_name, message, ctx=None): + UsageError.__init__(self, message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = 'unknown error' + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return 'Could not open file %s: %s' % (self.ui_filename, self.message) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + def __init__(self, code=0): + self.exit_code = code diff --git a/venv/lib/python3.6/site-packages/click/formatting.py b/venv/lib/python3.6/site-packages/click/formatting.py new file mode 100644 index 0000000..a3d6a4d --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/formatting.py @@ -0,0 +1,256 @@ +from contextlib import contextmanager +from .termui import get_terminal_size +from .parser import split_opt +from ._compat import term_len + + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows(rows, col_count): + for row in rows: + row = tuple(row) + yield row + ('',) * (col_count - len(row)) + + +def wrap_text(text, width=78, initial_indent='', subsequent_indent='', + preserve_paragraphs=False): + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + text = text.expandtabs() + wrapper = TextWrapper(width, initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False) + if not preserve_paragraphs: + return wrapper.fill(text) + + p = [] + buf = [] + indent = None + + def _flush_par(): + if not buf: + return + if buf[0].strip() == '\b': + p.append((indent or 0, True, '\n'.join(buf[1:]))) + else: + p.append((indent or 0, False, ' '.join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(' ' * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return '\n\n'.join(rv) + + +class HelpFormatter(object): + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__(self, indent_increment=2, width=None, max_width=None): + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args='', prefix='Usage: '): + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: the prefix for the first line. + """ + usage_prefix = '%*s%s ' % (self.current_indent, prefix, prog) + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = ' ' * term_len(usage_prefix) + self.write(wrap_text(args, text_width, + initial_indent=usage_prefix, + subsequent_indent=indent)) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write('\n') + indent = ' ' * (max(self.current_indent, term_len(prefix)) + 4) + self.write(wrap_text(args, text_width, + initial_indent=indent, + subsequent_indent=indent)) + + self.write('\n') + + def write_heading(self, heading): + """Writes a heading into the buffer.""" + self.write('%*s%s:\n' % (self.current_indent, '', heading)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write('\n') + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = ' ' * self.current_indent + self.write(wrap_text(text, text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True)) + self.write('\n') + + def write_dl(self, rows, col_max=30, col_spacing=2): + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError('Expected two columns for definition list') + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write('%*s%s' % (self.current_indent, '', first)) + if not second: + self.write('\n') + continue + if term_len(first) <= first_col - col_spacing: + self.write(' ' * (first_col - term_len(first))) + else: + self.write('\n') + self.write(' ' * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + lines = iter(wrap_text(second, text_width).splitlines()) + if lines: + self.write(next(lines) + '\n') + for line in lines: + self.write('%*s%s\n' % ( + first_col + self.current_indent, '', line)) + else: + self.write('\n') + + @contextmanager + def section(self, name): + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return ''.join(self.buffer) + + +def join_options(options): + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + for opt in options: + prefix = split_opt(opt)[0] + if prefix == '/': + any_prefix_is_slash = True + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + + rv = ', '.join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/venv/lib/python3.6/site-packages/click/globals.py b/venv/lib/python3.6/site-packages/click/globals.py new file mode 100644 index 0000000..843b594 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/globals.py @@ -0,0 +1,48 @@ +from threading import local + + +_local = local() + + +def get_current_context(silent=False): + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: is set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return getattr(_local, 'stack')[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError('There is no active click context.') + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault('stack', []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=None): + """"Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + ctx = get_current_context(silent=True) + if ctx is not None: + return ctx.color diff --git a/venv/lib/python3.6/site-packages/click/parser.py b/venv/lib/python3.6/site-packages/click/parser.py new file mode 100644 index 0000000..1c3ae9c --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/parser.py @@ -0,0 +1,427 @@ +# -*- coding: utf-8 -*- +""" +click.parser +~~~~~~~~~~~~ + +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. +""" + +import re +from collections import deque +from .exceptions import UsageError, NoSuchOption, BadOptionUsage, \ + BadArgumentUsage + + +def _unpack_args(args, nargs_spec): + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv = [] + spos = None + + def _fetch(c): + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError('Cannot have two nargs < 0') + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1:] = reversed(rv[spos + 1:]) + + return tuple(rv), list(args) + + +def _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage(opt, '%s option requires an argument' % opt) + raise BadOptionUsage(opt, '%s option requires %d arguments' % (opt, nargs)) + + +def split_opt(opt): + first = opt[:1] + if first.isalnum(): + return '', opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer(r"('([^'\\]*(?:\\.[^'\\]*)*)'" + r'|"([^"\\]*(?:\\.[^"\\]*)*)"' + r'|\S+)\s*', string, re.S): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in '"\'': + arg = arg[1:-1].encode('ascii', 'backslashreplace') \ + .decode('unicode-escape') + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError('Invalid start character for option (%s)' + % opt) + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = 'store' + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self): + return self.action in ('store', 'append') + + def process(self, value, state): + if self.action == 'store': + state.opts[self.dest] = value + elif self.action == 'store_const': + state.opts[self.dest] = self.const + elif self.action == 'append': + state.opts.setdefault(self.dest, []).append(value) + elif self.action == 'append_const': + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == 'count': + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError('unknown action %r' % self.action) + state.order.append(self.obj) + + +class Argument(object): + + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage('argument %s takes %d values' + % (self.dest, self.nargs)) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx=None): + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options = False + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + self._short_opt = {} + self._long_opt = {} + self._opt_prefixes = set(['-', '--']) + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, + obj=None): + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``appnd_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, + const=const, obj=obj) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, dest, nargs=1, obj=None): + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state): + pargs, args = _unpack_args(state.largs + state.rargs, + [x.nargs for x in self._args]) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state): + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == '--': + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt(self, opt, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt + if word.startswith(opt)] + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage(opt, '%s option does not take a value' % opt) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(prefix + ch, self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(prefix + ''.join(unknown_options)) + + def _process_opts(self, arg, state): + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if '=' in arg: + long_opt, explicit_value = arg.split('=', 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/venv/lib/python3.6/site-packages/click/termui.py b/venv/lib/python3.6/site-packages/click/termui.py new file mode 100644 index 0000000..bf9a3aa --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/termui.py @@ -0,0 +1,606 @@ +import os +import sys +import struct +import inspect +import itertools + +from ._compat import raw_input, text_type, string_types, \ + isatty, strip_ansi, get_winterm_size, DEFAULT_COLUMNS, WIN +from .utils import echo +from .exceptions import Abort, UsageError +from .types import convert_type, Choice, Path +from .globals import resolve_color_default + + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_input + +_ansi_colors = { + 'black': 30, + 'red': 31, + 'green': 32, + 'yellow': 33, + 'blue': 34, + 'magenta': 35, + 'cyan': 36, + 'white': 37, + 'reset': 39, + 'bright_black': 90, + 'bright_red': 91, + 'bright_green': 92, + 'bright_yellow': 93, + 'bright_blue': 94, + 'bright_magenta': 95, + 'bright_cyan': 96, + 'bright_white': 97, +} +_ansi_reset_all = '\033[0m' + + +def hidden_prompt_func(prompt): + import getpass + return getpass.getpass(prompt) + + +def _build_prompt(text, suffix, show_default=False, default=None, show_choices=True, type=None): + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += ' (' + ", ".join(map(str, type.choices)) + ')' + if default is not None and show_default: + prompt = '%s [%s]' % (prompt, default) + return prompt + suffix + + +def prompt(text, default=None, hide_input=False, confirmation_prompt=False, + type=None, value_proc=None, prompt_suffix=': ', show_default=True, + err=False, show_choices=True): + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 7.0 + Added the show_choices parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: asks for confirmation for the value. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + """ + result = None + + def prompt_func(text): + f = hide_input and hidden_prompt_func or visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text, nl=False, err=err) + return f('') + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt(text, prompt_suffix, show_default, default, show_choices, type) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + elif default is not None: + if isinstance(value_proc, Path): + # validate Path default value(exists, dir_okay etc.) + value = default + break + return default + try: + result = value_proc(value) + except UsageError as e: + echo('Error: %s' % e.message, err=err) + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func('Repeat for confirmation: ') + if value2: + break + if value == value2: + return result + echo('Error: the two entered values do not match', err=err) + + +def confirm(text, default=False, abort=False, prompt_suffix=': ', + show_default=True, err=False): + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + prompt = _build_prompt(text, prompt_suffix, show_default, + default and 'Y/n' or 'y/N') + while 1: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt, nl=False, err=err) + value = visible_prompt_func('').lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() + if value in ('y', 'yes'): + rv = True + elif value in ('n', 'no'): + rv = False + elif value == '': + rv = default + else: + echo('Error: invalid input', err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + shutil_get_terminal_size = getattr(shutil, 'get_terminal_size', None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + # We provide a sensible default for get_winterm_size() when being invoked + # inside a subprocess. Without this, it would not provide a useful input. + if get_winterm_size is not None: + size = get_winterm_size() + if size == (0, 0): + return (79, 24) + else: + return size + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + cr = struct.unpack( + 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + except Exception: + return + 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) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get('LINES', 25), + os.environ.get('COLUMNS', DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text_or_generator, color=None): + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = text_or_generator() + elif isinstance(text_or_generator, string_types): + i = [text_or_generator] + else: + i = iter(text_or_generator) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, string_types) else text_type(el) + for el in i) + + from ._termui_impl import pager + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar(iterable=None, length=None, label=None, show_eta=True, + show_percent=None, show_pos=False, + item_show_func=None, fill_char='#', empty_char='-', + bar_template='%(label)s [%(bar)s] %(info)s', + info_sep=' ', width=36, file=None, color=None): + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already displayed. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: a function called with the current item which + can return a string to show the current item + next to the progress bar. Note that the current + item can be `None`! + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: the file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + """ + from ._termui_impl import ProgressBar + color = resolve_color_default(color) + return ProgressBar(iterable=iterable, length=length, show_eta=show_eta, + show_percent=show_percent, show_pos=show_pos, + item_show_func=item_show_func, fill_char=fill_char, + empty_char=empty_char, bar_template=bar_template, + info_sep=info_sep, file=file, label=label, + width=width, color=color) + + +def clear(): + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + # If we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system('cls') + else: + sys.stdout.write('\033[2J\033[1;1H') + + +def style(text, fg=None, bg=None, bold=None, dim=None, underline=None, + blink=None, reverse=None, reset=True): + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + .. versionadded:: 7.0 + Added support for bright colors. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + """ + bits = [] + if fg: + try: + bits.append('\033[%dm' % (_ansi_colors[fg])) + except KeyError: + raise TypeError('Unknown color %r' % fg) + if bg: + try: + bits.append('\033[%dm' % (_ansi_colors[bg] + 10)) + except KeyError: + raise TypeError('Unknown color %r' % bg) + if bold is not None: + bits.append('\033[%dm' % (1 if bold else 22)) + if dim is not None: + bits.append('\033[%dm' % (2 if dim else 22)) + if underline is not None: + bits.append('\033[%dm' % (4 if underline else 24)) + if blink is not None: + bits.append('\033[%dm' % (5 if blink else 25)) + if reverse is not None: + bits.append('\033[%dm' % (7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return ''.join(bits) + + +def unstyle(text): + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho(message=None, file=None, nl=True, err=False, color=None, **styles): + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + .. versionadded:: 2.0 + """ + if message is not None: + message = style(message, **styles) + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit(text=None, editor=None, env=None, require_save=True, + extension='.txt', filename=None): + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + editor = Editor(editor=editor, env=env, require_save=require_save, + extension=extension) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: waits for the program to stop. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar = None + + +def getchar(echo=False): + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def raw_terminal(): + from ._termui_impl import raw_terminal as f + return f() + + +def pause(info='Press any key to continue ...', err=False): + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: the info string to print before pausing. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/venv/lib/python3.6/site-packages/click/testing.py b/venv/lib/python3.6/site-packages/click/testing.py new file mode 100644 index 0000000..1b2924e --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/testing.py @@ -0,0 +1,374 @@ +import os +import sys +import shutil +import tempfile +import contextlib +import shlex + +from ._compat import iteritems, PY2, string_types + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +clickpkg = sys.modules[__name__.rsplit('.', 1)[0]] + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, 'read'): + if PY2: + return input + rv = _find_binary_reader(input) + if rv is not None: + return rv + raise TypeError('Could not find binary reader for input stream.') + + if input is None: + input = b'' + elif not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__(self, runner, stdout_bytes, stderr_bytes, exit_code, + exception, exc_info=None): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or False(y) if not available + self.stderr_bytes = stderr_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self): + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + @property + def stderr(self): + """The standard error as unicode string.""" + if not self.stderr_bytes: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + + def __repr__(self): + return '<%s %s>' % ( + type(self).__name__, + self.exception and repr(self.exception) or 'okay', + ) + + +class CliRunner(object): + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__(self, charset=None, env=None, echo_stdin=False, + mix_stderr=True): + if charset is None: + charset = 'utf-8' + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli): + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or 'root' + + def make_env(self, overrides=None): + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation(self, input=None, env=None, color=False): + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + input = make_input_stream(input, self.charset) + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = clickpkg.formatting.FORCED_WIDTH + clickpkg.formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + if PY2: + bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + sys.stdout = bytes_output + if not self.mix_stderr: + bytes_error = StringIO() + sys.stderr = bytes_error + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = io.TextIOWrapper( + bytes_output, encoding=self.charset) + if not self.mix_stderr: + bytes_error = io.BytesIO() + sys.stderr = io.TextIOWrapper( + bytes_error, encoding=self.charset) + + if self.mix_stderr: + sys.stderr = sys.stdout + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or '') + val = input.readline().rstrip('\r\n') + sys.stdout.write(val + '\n') + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write((prompt or '') + '\n') + sys.stdout.flush() + return input.readline().rstrip('\r\n') + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi(stream=None, color=None): + if color is None: + return not default_color + return not color + + old_visible_prompt_func = clickpkg.termui.visible_prompt_func + old_hidden_prompt_func = clickpkg.termui.hidden_prompt_func + old__getchar_func = clickpkg.termui._getchar + old_should_strip_ansi = clickpkg.utils.should_strip_ansi + clickpkg.termui.visible_prompt_func = visible_input + clickpkg.termui.hidden_prompt_func = hidden_input + clickpkg.termui._getchar = _getchar + clickpkg.utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, not self.mix_stderr and bytes_error) + finally: + for key, value in iteritems(old_env): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + clickpkg.termui.visible_prompt_func = old_visible_prompt_func + clickpkg.termui.hidden_prompt_func = old_hidden_prompt_func + clickpkg.termui._getchar = old__getchar_func + clickpkg.utils.should_strip_ansi = old_should_strip_ansi + clickpkg.formatting.FORCED_WIDTH = old_forced_width + + def invoke(self, cli, args=None, input=None, env=None, + catch_exceptions=True, color=False, mix_stderr=False, **extra): + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + exception = None + exit_code = 0 + + if isinstance(args, string_types): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + exit_code = e.code + if exit_code is None: + exit_code = 0 + + if exit_code != 0: + exception = e + + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write('\n') + exit_code = 1 + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + stderr = outstreams[1] and outstreams[1].getvalue() + + return Result(runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + exit_code=exit_code, + exception=exception, + exc_info=exc_info) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): + pass diff --git a/venv/lib/python3.6/site-packages/click/types.py b/venv/lib/python3.6/site-packages/click/types.py new file mode 100644 index 0000000..1f88032 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/types.py @@ -0,0 +1,668 @@ +import os +import stat +from datetime import datetime + +from ._compat import open_stream, text_type, filename_to_ui, \ + get_filesystem_encoding, get_streerror, _get_argv_encoding, PY2 +from .exceptions import BadParameter +from .utils import safecall, LazyFile + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + is_composite = False + + #: the descriptive name of this type + name = None + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or '').split(self.envvar_list_splitter) + + def fail(self, message, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode('utf-8', 'replace') + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return 'UNPROCESSED' + + +class StringParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode('utf-8', 'replace') + return value + return value + + def __repr__(self): + return 'STRING' + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = 'choice' + + def __init__(self, choices, case_sensitive=True): + self.choices = choices + self.case_sensitive = case_sensitive + + def get_metavar(self, param): + return '[%s]' % '|'.join(self.choices) + + def get_missing_message(self, param): + return 'Choose from:\n\t%s.' % ',\n\t'.join(self.choices) + + def convert(self, value, param, ctx): + # Exact match + if value in self.choices: + return value + + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = self.choices + + if ctx is not None and \ + ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = [ctx.token_normalize_func(choice) for choice in + self.choices] + + if not self.case_sensitive: + normed_value = normed_value.lower() + normed_choices = [choice.lower() for choice in normed_choices] + + if normed_value in normed_choices: + return normed_value + + self.fail('invalid choice: %s. (choose from %s)' % + (value, ', '.join(self.choices)), param, ctx) + + def __repr__(self): + return 'Choice(%r)' % list(self.choices) + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + name = 'datetime' + + def __init__(self, formats=None): + self.formats = formats or [ + '%Y-%m-%d', + '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%d %H:%M:%S' + ] + + def get_metavar(self, param): + return '[{}]'.format('|'.join(self.formats)) + + def _try_to_convert_date(self, value, format): + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert(self, value, param, ctx): + # Exact match + for format in self.formats: + dtime = self._try_to_convert_date(value, format) + if dtime: + return dtime + + self.fail( + 'invalid datetime format: {}. (choose from {})'.format( + value, ', '.join(self.formats))) + + def __repr__(self): + return 'DateTime' + + +class IntParamType(ParamType): + name = 'integer' + + def convert(self, value, param, ctx): + try: + return int(value) + except (ValueError, UnicodeError): + self.fail('%s is not a valid integer' % value, param, ctx) + + def __repr__(self): + return 'INT' + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'integer range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'IntRange(%r, %r)' % (self.min, self.max) + + +class FloatParamType(ParamType): + name = 'float' + + def convert(self, value, param, ctx): + try: + return float(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid floating point value' % + value, param, ctx) + + def __repr__(self): + return 'FLOAT' + + +class FloatRange(FloatParamType): + """A parameter that works similar to :data:`click.FLOAT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'float range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = FloatParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'FloatRange(%r, %r)' % (self.min, self.max) + + +class BoolParamType(ParamType): + name = 'boolean' + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ('true', 't', '1', 'yes', 'y'): + return True + elif value in ('false', 'f', '0', 'no', 'n'): + return False + self.fail('%s is not a valid boolean' % value, param, ctx) + + def __repr__(self): + return 'BOOL' + + +class UUIDParameterType(ParamType): + name = 'uuid' + + def convert(self, value, param, ctx): + import uuid + try: + if PY2 and isinstance(value, text_type): + value = value.encode('ascii') + return uuid.UUID(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid UUID value' % value, param, ctx) + + def __repr__(self): + return 'UUID' + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + name = 'filename' + envvar_list_splitter = os.path.pathsep + + def __init__(self, mode='r', encoding=None, errors='strict', lazy=None, + atomic=False): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + if self.lazy is not None: + return self.lazy + if value == '-': + return False + elif 'w' in self.mode: + return True + return False + + def convert(self, value, param, ctx): + try: + if hasattr(value, 'read') or hasattr(value, 'write'): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile(value, self.mode, self.encoding, self.errors, + atomic=self.atomic) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + return f + + f, should_close = open_stream(value, self.mode, + self.encoding, self.errors, + atomic=self.atomic) + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + return f + except (IOError, OSError) as e: + self.fail('Could not open file: %s: %s' % ( + filename_to_ui(value), + get_streerror(e), + ), param, ctx) + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. It + will not expand a tilde-prefix, as this is + supposed to be done by the shell only. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param path_type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + envvar_list_splitter = os.path.pathsep + + def __init__(self, exists=False, file_okay=True, dir_okay=True, + writable=False, readable=True, resolve_path=False, + allow_dash=False, path_type=None): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name = 'file' + self.path_type = 'File' + elif self.dir_okay and not self.file_okay: + self.name = 'directory' + self.path_type = 'Directory' + else: + self.name = 'path' + self.path_type = 'Path' + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b'-', '-') + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail('%s "%s" does not exist.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail('%s "%s" is a file.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail('%s "%s" is a directory.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.writable and not os.access(value, os.W_OK): + self.fail('%s "%s" is not writable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.readable and not os.access(value, os.R_OK): + self.fail('%s "%s" is not readable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + return self.coerce_path_result(rv) + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<" + " ".join(ty.name for ty in self.types) + ">" + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError('It would appear that nargs is set to conflict ' + 'with the composite type arity.') + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python ty into the most appropriate param + ty. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError('Attempted to use an uninstantiated ' + 'parameter type (%s).' % ty) + except TypeError: + pass + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but internally +#: no string conversion takes place. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. This is usually useful when working +#: with file paths as they can appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/venv/lib/python3.6/site-packages/click/utils.py b/venv/lib/python3.6/site-packages/click/utils.py new file mode 100644 index 0000000..fc84369 --- /dev/null +++ b/venv/lib/python3.6/site-packages/click/utils.py @@ -0,0 +1,440 @@ +import os +import sys + +from .globals import resolve_color_default + +from ._compat import text_type, open_stream, get_filesystem_encoding, \ + get_streerror, string_types, PY2, binary_streams, text_streams, \ + filename_to_ui, auto_wrap_for_ansi, strip_ansi, should_strip_ansi, \ + _default_text_stdout, _default_text_stderr, is_bytes, WIN + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv, \ + _hash_py_argv, _initial_argv_hash + + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return '-'.join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + return wrapper + + +def make_str(value): + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode('utf-8', 'replace') + return text_type(value) + + +def make_default_short_help(help, max_length=45): + """Return a condensed version of help string.""" + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == '.': + done = True + new_length = result and 1 + len(word) or len(word) + if total_length + new_length > max_length: + result.append('...') + done = True + else: + if result: + result.append(' ') + result.append(word) + if done: + break + total_length += new_length + + return ''.join(result) + + +class LazyFile(object): + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__(self, filename, mode='r', encoding=None, errors='strict', + atomic=False): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + if filename == '-': + self._f, self.should_close = open_stream(filename, mode, + encoding, errors) + else: + if 'r' in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return '' % (self.name, self.mode) + + def open(self): + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream(self.name, self.mode, + self.encoding, + self.errors, + atomic=self.atomic) + except (IOError, OSError) as e: + from .exceptions import FileError + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: https://pypi.org/project/colorama/ + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, echo_native_types): + message = text_type(message) + + if nl: + message = message or u'' + if isinstance(message, text_type): + message += u'\n' + else: + message += b'\n' + + # If there is a message, and we're in Python 3, and the value looks + # like bytes, we manually need to find the binary stream and write the + # message in there. This is done separately so that most stream + # types will work as you would expect. Eg: you can write to StringIO + # for other cases. + if message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener() + + +def get_text_stream(name, encoding=None, errors='strict'): + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts on Python 3 + for already correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener(encoding, errors) + + +def open_file(filename, mode='r', encoding=None, errors='strict', + lazy=False, atomic=False): + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, + atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + return filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no affect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = roaming and 'APPDATA' or 'LOCALAPPDATA' + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser('~') + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser('~/.' + _posixify(app_name))) + if sys.platform == 'darwin': + return os.path.join(os.path.expanduser( + '~/Library/Application Support'), app_name) + return os.path.join( + os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')), + _posixify(app_name)) + + +class PacifyFlushWrapper(object): + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped): + self.wrapped = wrapped + + def flush(self): + try: + self.wrapped.flush() + except IOError as e: + import errno + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr): + return getattr(self.wrapped, attr) diff --git a/venv/lib/python3.6/site-packages/easy_install.py b/venv/lib/python3.6/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/venv/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/venv/lib/python3.6/site-packages/flask/__init__.py b/venv/lib/python3.6/site-packages/flask/__init__.py new file mode 100644 index 0000000..ded1982 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/__init__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +""" + flask + ~~~~~ + + A microframework based on Werkzeug. It's extensively documented + and follows best practice patterns. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +__version__ = '1.0.2' + +# utilities we import from Werkzeug and Jinja2 that are unused +# in the module but are exported as public interface. +from werkzeug.exceptions import abort +from werkzeug.utils import redirect +from jinja2 import Markup, escape + +from .app import Flask, Request, Response +from .config import Config +from .helpers import url_for, flash, send_file, send_from_directory, \ + get_flashed_messages, get_template_attribute, make_response, safe_join, \ + stream_with_context +from .globals import current_app, g, request, session, _request_ctx_stack, \ + _app_ctx_stack +from .ctx import has_request_context, has_app_context, \ + after_this_request, copy_current_request_context +from .blueprints import Blueprint +from .templating import render_template, render_template_string + +# the signals +from .signals import signals_available, template_rendered, request_started, \ + request_finished, got_request_exception, request_tearing_down, \ + appcontext_tearing_down, appcontext_pushed, \ + appcontext_popped, message_flashed, before_render_template + +# We're not exposing the actual json module but a convenient wrapper around +# it. +from . import json + +# This was the only thing that Flask used to export at one point and it had +# a more generic name. +jsonify = json.jsonify + +# backwards compat, goes away in 1.0 +from .sessions import SecureCookieSession as Session +json_available = True diff --git a/venv/lib/python3.6/site-packages/flask/__main__.py b/venv/lib/python3.6/site-packages/flask/__main__.py new file mode 100644 index 0000000..4aee654 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/__main__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" + flask.__main__ + ~~~~~~~~~~~~~~ + + Alias for flask.run for the command line. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +if __name__ == '__main__': + from .cli import main + main(as_module=True) diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81e4f944d6674e39e82482bdd9a79d33dffbe384 GIT binary patch literal 1792 zcmZ8hTW=Fb6kcD~u^lIla{~elBwP%MorFthN-GMb5>ksQQmN9Y(rE1++Z)f>-Oh|j z!b9KtQ}_>k>QjHiJho5#g+BG1jUAvX`SUs7oIUs12lMmQzy4_a@_X6y{_#F}@+d#U zpShRwywKxbnB%!H9~M*|3cQf>P%f$>lz1tVOR5Y$_o2cosFy=u%|Vq{p~h=a=k<)M zsCj7cMkddx1z6;Z(Bw^6;!DutEm-Euu)!IvMByoeBY&M>@~-kmnl!<{_9AdMO%n~{Kw$!JakN1X8{C||hMAHZ8Ir^E;;=A{d*~Kt z#2|_zGeTx%nAnTbaqesa+K_~w+L<%+#$G2&?dM?a38^WdK>?^ zPtA`8XRb26CPweju|FLEZ;-*q)qC&h1M)%eZ?|h9?WR$>)0;#p+<77oqJ!Y^X*c_T zbm_8>yF%dpSs^+p26+leI8pLz>ZoA|#eA_?&((8_`DMiI0?V)GQ7b(3>&0@Rp8F4k C+A4zp literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/__main__.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/__main__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc32b9290e86e35b2a8eea9631bbf11b7fb170bc GIT binary patch literal 419 zcmY*V%}T>S5Z+BCK7cn* zo_vN}J^2cr+@uzCV859izL{_Mj@oVa<8Aw47bEnE{)BDnGxPMG0glE9FvoK%+u;_s zrKRk#jS<+~;Tta)Bi0 zt9_yY$nDMLU^p7o5-Q1naLAdE+IP#=`qnSw1oCj{RHxs2c)ZCpRS7R73_Yi8Qp%Hv z(rO@P3QT23Qe>51OO!QDs^L2ba+LCa4Vx)}ns8C|muN Q%BgF1=!OBuYT+&X1K31$m;e9( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/_compat.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/_compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee21b0302863cda38a09cb38e81ce9078d41b9c7 GIT binary patch literal 3191 zcmbVO-EtH~6z-mx{bjQd2!TM9_McVQAeLf9q!5f0C9aXA1h%Z|nw{=VhRn{4-Mx@a zMK4&Y^iE&Hcks$9pP_HP;uXB|oSw~wfJ*6Xbx-%{?eCoa&QH&KGc)zye{Ftq>kuJ- zkf)yGFun>+e@zJyq)P-9UP8N6()*sE3q<%^Ue_0aC_N_KK>GTDEOpDW)TiBwtU_NC zWw%xr756?Qs_xwYq*^jFXm$@%M6D-B2D9B+7@ro0MB_2-9+g4&Sh_Cf5KqqaJw%kp z;aw9m6U^oW^Y9e&2w)zbV$K(s@`RWjQ@}ndj)9%W#GE(|?~`J_yC6?VDo%{OpQ*Zi zgNT!2;V}^l^7Pp6E{-mY7UklY{M4XCzBDF}=p7=wugGn3m)s#~lM?(rBKJt@IY~Pp z^5v~MU|lZO#HsEAtj>e{B`04kh?d7O2@F4^_h;h znasQnFh&udj60R#-n%Y>+9iMVc^9 zbi4ipBeC ziZ6v9Y%hI=EH62(mnK}d^O3DyPQpP?gjZ$}8X8e$=niN`Q=H}o3=HVLPse0Todqq= z2CKcSux^eT%2(7{g-&3|0VX{l_lU;ACrsiNocfB!vM0cTy z!hgWt4Ch9Lk?e)h7U#D4FgBa}l9q2hliQLb0fxP22(T3;RTyi@K$%9*5n6|zItHTy zTu;NN3M=43GM<H zEox4-j3I#pbqVBkc1lCjKmQ>_!XeIwX&hxjLL8K3iX#YnO!sHJ?o#v;LP8@uZ^nZ> zkpr0;%}vI!_@x`|%Sjf6iM|4ZBEvyNh2tvc>Lly~a{MUK&tTiRze9T;l@;Mt#qh$| zo*ojT9y1;DRlf<{4e|r|f%f691YWAbGi2<42R&wh@cSet;{d8hu=B=sB|{@w=!!Rs zphjti832+2_{|C05kO8KRECenw3nm{snqqJRtFce@4#Pisk9F>C1fg!kXwB4jSaI# zW0m_6vh+u?>yHtNb{t2oKw&+wK^hLEt((nQbG&o3OB!Ie9cUmvBtv%V*X$7_lW6%jmIZ21L}!^FQouf(0QC|pw|AE6RQZ)x6F zXJPi4oy|x2h)-@*9;f~6fM=1KtGEq=YtOSqYN1a>fFE0;1P&?NfPb-}rU8g$Xj+O; z>EwDWOr@I`t&(~b*41m+y^bB0XZ0?2?tuFp`bNDC-5N9pSfy3ZN!B5-TW2slMHWF# zSb~4p#?$Vx{_4Gpw#H)tbik(;90E>KGjiK-3=rEWYK@y{>&L0FGtkKmpcVh1)g0=_ z4{C*^*-D(^7-9kfA`r5m;utxYak8^~=Lxp3;9xOV%? z&sREp_1@||etrG!7dLM6mAg0B6;^*+&U*Jz4<6k%Khat$1K)ouN@Z|@b+FA1|Bf#B zCMt653L2?zK^J&cuSu(ZKm%H)We+$678|tT)k|fN;%r|A<8pOApbdJY;!zJ)=U^Ai IV04831?pS3asU7T literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/app.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/app.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a545d9eadaab4893f47ece1bfbdb262ac0023bf7 GIT binary patch literal 70866 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

n2@=} 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 U`y;2Cq#rSD?qW0@wOUvH2BwziSpWb4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/blueprints.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/blueprints.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea0694ebf3694b013f58357bd02c557ab771bdc6 GIT binary patch literal 20455 zcmd5^Ta4V+c_um6on5V0cSXL@wq$!_X(T!FC2K{oY|D;gXX98-+-#lBa_4Y%XEZY$ zlN_xy7zL>1#0wNj9$Fv`QnW>Zw#ZwXw&+WXqJ3%K3iPdfYLSN`K>OB*B0!6N|9{BC z!x^sjA{og_!{H3c{~VtG`@jFfbLMjg4%GhXZ{|Pv@f(KmGei3;V*h2lf_JbH#)=_K zVRg-(wPKmHU+5Nk#g!uVi=xym^~x*dUS*|X8gCe)EGi!xqT*KX6jo;NxhiJxdB!c{ zb4}E)8H=++(=?2ljlWjc39i@Ix}+-(KGcm+XJ|iT&*P3+L@MG==8hak^bM4D8T#dUbAK z2}0d|;4ay(Tzl<|9k{Oj_M5L>UA}hJZp9t3g&R8UZcwlN9Aj%Nn$i4lAkbiA(?_pd zAKz4mez(!_+WntnoQy>)I^1~2X$ZKR zk6{l&r{8pKuZ5G^f!%}>pbhN!F4`3FILndkx#7mr>bE6eR1fPt=epYnsGki;3*A+l zPV_{oM|%LNu3#wu2y_PA$o|?*d|JcE+B9qo2C2tp34=v{6}-q8Ud1c;7@M&*HX6p* z#MT@au(ifTY_Zp|Iz?gLF>jZ~C1G5z`WNw?*(uRyoPiggVd0GOxXfpKgU=|_XPi+E zEBv{7hosM7f2LE5uPU^RJGc@CXFx~Au%^*ag+WGHc?TufwIFS@rDEA3zT5L zM#sw%w~Lji7`WY*KSx*2(&hkd=4qp({lxH(;EP{eI2ZN?=LYS;*|lN2E6%>?zR-Tb zdH&`(w!m|&-gBzIL49y5sx}(!emiV5J_7;4L)aKrxlk^a%VlfMteVwg{EqMD&Cx>& z94UP3iHPMUX_NlSc#)Rh!YlYaY%tQGw(B$gvt!dgBdiXz(1Feb#(ivdU@v#f7HQAy zLt7o=wmB|BQhE3qg}4O9G6DRyS%ArnL1` zVE3J#D@}-wEdRnh#}J6B2_{FS(?R`ous9!Mj94xz1B!lo5S6>~y#|AhFOUc#Wijad z1?)wIfj3~JMRSf24MHg0KO-Q*MsZ-Xqvt z#w$39jZvzZMf^KymCbnqn_0%|ka^4;*?B`O zJ{&sT_(-ME5MHy<@Q ze6YO*o-eGF@v7ie#cKwyns}L9IlREEbl@v<(s8dG5LZM^%;Lzrcty;K1K4{&%!>!$ zI~K&NVnH0lHwVQbaTwnm60eCP;wZj3EUt=U;yCt>h}Xpl@fqwL6>o@>;z8^k6JHV! ziHEUwT)ZhB5szZ;gs{b9kntJuxOf8ZC&ejo8t)H^C&g2Ee@Hwn7V-YD_^fya?~jNx z;w;`D6?JhA@3uHEF5vw!@vQh9-X9ki#dCOnLOd^C!22ojqWC=CPm3k-65gK_m&6zF z{*<^ZzKHjyMFE!fdH$X%Ii%79fE-d}T=F(4GVz}Xi9Gmz;1~kgM z!0K>lvkf1#=Cb#hG^izZg38e;+Y0KcS1GNn%1DLGSy6#%i;W#YhX+gd$-(y51KaDf z;gjE(u>Na^RhHmHmR8d?S5?%)!rFZVF~kU7KMs!Sb^C_v2lxWGcg4~Yg;0F%>&s1Y z67)y!gje>VZ(}EfUmTMsEsbY{`8|Y@>`yKBf`u`>V57*swZy))ybf+|RK`{InXj~s z+tqOu-{3R!Wi2CMn(;j^Yz&-mV{yhOR+o14DD9CilO%M2B7}Cc(c%CmdLaJD?h}_r zhrl_m@4JGdDE5>7L0r99V>0ncTr`Ua)AK_%X@8Mqf0n*}AVhpbabqk!ZC3Ku({$zp z(U7g*z$>5~qgZ2dDT83-zba^FbV#XP`LL!%r{k{>zj$CT;sYFs;h)0R^iOfbZuJVc z*)@f5RCf@ZV5s4)I^{9%bHG;`{rkIdJVXdj@FSs0!5HYDP`cqt>?n8u^vapBOEZ z5cF}C0~sSU$JQ2ypfI_@=zrh${Of_;ZC?jzNM%Tgt2|orZC4r;cLyy*>hv7>6`|82UFUXOM{nMH;C#ae6x1z;l4XKvWdAdq^}Sf;DKK z$w*Oc%9MdLPx_QCr)X*tn&^+-$rvfr2*@w90nTsXUB&7q_=#g-&{T=hjn8DPX~Yp# z;?(a)B!>f3P{8QPNp&%H>X*76Iuu;4C;6h~KS$!IBQZFn{1=i&k_IV+h-RgtSk`aj z3)x;7@Hm>=o(h<$Uqr3UHWb{4xJ?kZg>aV=M|1SES2=HkHD!~#7$I@)rc{;h(iA-6 z{F1=|MQ~0Y=Wnkbqzl$Xa5G_DQT*r&omo9LJahvl~g6%ZhmJtvV1AtgRh=A$l< zgRIhKm8H7JSWJ1ErG^AE zq$E7@h1*C!I~J0bVuw-@1bD~kID$M;{9eH{ZXUy@@@vMo<~R{W@?jbuF1>Gv5_DE} zE}}QDN`?oy#+u?>te%W+LuqU^6KUWo&M#6gKY|#XXTM`t5CpeyW}61b)eWe*?u2 z8SQZ)1s`laPx2o@KGSM?dmC_qYc5>8c6-xwnRep6(Zab)6mTuI+Fh5jn9D0=8Bi@+ z{^NkE{}?uKf&MxA@Of-j4x$w<)2JX!raBZstt=qM7V0R3vfGOjxyic1^SFYON{-hi zJzzDti9g0^0i}$_9MU(Wa7DyebA`D~T$P-xykX)A$+!bD=}(ML%ug&N=F%e;#*`=& zMn8I6^MA48ydl+~C~TmDUp8SNge93MABK9AI+n=!EUi*7iYpO$#}z4ZLQ}an=h+EQ zDJ7=bQ67r8hHi&F)G6$2Aw(n+>6mw{+vb+lv9^dxj8Bah`3ilSeFU&3DdL=j#8dT`{ z$lNOU7ej0jH(UNi94&M#9KVR;;Lwj~2n!MypA=e1ol!zX;SS}R3b0Wf{oyn=^wPj? zA)??xmV93!5}EbUGirnsE(3~Qhh2(r5%_q0)T;Zo@WOymFuIstktr=nKyGuXLLSFW=3WJBoK{gI%jHOKg)`*Ug|o%HQ`+TXPhQot2ugF z^|G!HdJ4DXqUFV6G=Bx#KG?Re;;`gumyJvQ4x+Oc+s3ME27E&j(t z2;ov%MHeUIwhfPxI+#bP1PzB^D0L8zA`~X`-y;4jEN39EE+kI`x&;Myz&4i*E?@xg z7Q45Vc~zX`+5_x>+#HTF<}P7hW7&hrAgHH65l%=f;N=uv>aJAcpvX2gh$&%c{6*O~ zxBHsb5gG#==Inx%^aQHRR<*7%ZyguWlHq%ZL@RXW@r@tg_>c8ugsV9 z;z)9rdo!TX|Gk?$3Uch`FhIc@PxE9U2Z2);&$Q0i&J8@Tn|x{r(-4%0lJzOHX2R!0 zPD9GcH%9r4kpn;(ic%!C#73CZ@iV?Y=@Vzt1a3N2wNG-?p9&yIB)ThWjxa@$gKzLi zmYKIqAR1^!eU1u9Nu`ZzV8~>T6R*OK8WVRJ;{urF+FLd<@JYGLk|Qm} zr-Ez-G2DiZn6yzsOmsL$=D(@-EAxfX!*^}JNtR20ggC{GAuf8 zVmv=RWYO49jC(%1Y+Kf8+?!4lbgXdFrMQ(N3Ym4}4AUx}Q^!%nOFa^+4j^EJSK1Hl$$dP)PkGFkMqZFqGS|i3^bJXiMbXCvQ%y`%+Zntnn{8rnJH-R4?TVvt(KL^)Ig7q?$CohlH((H z2kd&+TXVYiPLEPfK44PW&2Y_UWP1XPxH~YFS<+wsv*DcgehCla{c?54(*FFE3!wsCCxJg zp_nx97F9~ADTwb6ZGHu``M3fx(dONvO4$cRoYdi}fd^OZmW^i$0X^Eq zgkt^4i@G?!DwlMe@5aLDQNRy2nFJ@pg>S zJ!noVw?&7hC4F8gu6W4OX28~`Pu+*|?rf{PdZVf+wOvVrS8DWKb=;q(?Z2Ff#-ISz%EIdW&J8~^5M+g?URzfq8ayMN{|`Rdw|0f zBOk~}`jP?y5%TeE+RN8|LTkBvob%{9)9`k>pP*=Eo*Gr#EGVP+T!tq5U)!zQO>X9{ z9Q_{5b(b9dbxn6XUwE7S z-B`3zWfE>t@RSX+qA(tJpfY!u93kWRIP`INAhF|rRfqV=#d`oXlmV=Kk_G_UCf0nKdMZgP}1H%(V}mV;Q|N`%l*odn26qoi)s6UQuCQUMQ&_QH=gw6Or*ytbWB zlxM)0VCnhNz3=LVX}^#Y$oU4M05Ims>)1MYX;Pz4<{HtWH1Y$oG2ht*-ufO}Y&1;Wo3aoM=@!VO>U!*jEX=OCa zi{^f(g+cQ6ndyo$#*9xw=$euTribyG9J#_DvvFnnGzZtaf!fk`lV|qoU5?X4U%oY3 zx~*<)@1EtiNHa9p2qvCQp_nf|1>_|9cCHm3%NO}wg$znj(>1a6{L}Y^k3W4iUR02R zgW>=}N3yP1VM2=oGFVV5PS!80>3;lE0dj>q@5ZxOA&ZS*`xnn& zM4X383#NM`_xzWZWC7kAT@%unnMCf_fWPpTo{A{Z{sF7W4TSL0s} z*v6Bnz?XiIf~J~N;G3>T+Aj1}mnADLFzKAu`(O(C9h#ARS3agJL`X1&+wlB`d$Z~C@5so=n1XT+FVpb&r-@Bs9qUUeGwEZL+T&h=;}*3= z4Ne8ef3ED(JZ6ow+WZcUW&&dtuLs7eJ$Y~6Ld$=m8k(Iijx_hDH>4(fkkPB>j|yV8uDJ7p5b%hw`jgj|1JC~4Xv`u{$G^qoleo9oTkl_v^h^3TEMw7*9q`@1#X`c z;`kGx6zQ>lhR!-m8~&LKinZjL^cQK5mVWv#(dII39-+-+w0WI2G_~1(i#9Zi&!*M>U#HDCX!C2d`6g|Coi-oPra>ErHnh&lZ_-B4h78tUrwu=(PdA*& zKZOG%J)m}~)uM%;`Y9F*#R|5?qJ;(i_*XknJy4ykRca@ywc2cTzBY${^YUMHrdq95 zcstA6Dz@~mf`12nlE1t-%VQbMutj=aH{iAUD+e}R|N6)su2ZTM_(T*~e8#`=6v!Vj nDbrVFxe%V0owLBaJBg~7WjC#sU9l}5r<>_YTE3l%Bj1@yM!vI^tbFGxIr+|4^737%6!7gd zi>g@> zU+dn=y{-L~{jK{d_q7gG4#@ej=BHW*D+lGc)V#m-K;?nfrz@XsxfRz+ZIomr4^|$$ zl4|dFQr`4>QU50^#eXVYdGM`N+kP|kQc8`hiCZZ(;q6{~Xe(WLSnX1iw^EfymQ%}? z+O4K;S(QiC9<>+e9#i+IefU14?p6EoT~@w2pgx5fht)xKKh8XkR*t9#RxI^t<$8~+ z`|$6<+u6zt`k7V_p`VAmS@d!gzaLhQ;P)f)`xx$f!aIiAkKVQ`$JJx%5L$Z@waV%+ zY8}S)r*PkAaOQD!1ZR$TpTX~^)r^`&&1Y1gj;doA$+PMSbsT3ti<(cWr%>}L+&hQ5 zpHrVvPvgo7{C-Y7qn=fty=~+8c{Qg#r%tHn)bqC;`Tc@AsZOaEli#Pk&uyjD8Flt{ zTCSf%`2xo3;`0*Doxst{>iq4DT>ZRCt1sYQQ}+UXy^{Qz$FEnDUl(!zYx3*3x}+}O zN^Mzp{;QlstIw$g^}3ArN%e-hVro`S$(1+NTgj7D)E9B?Mb+D~)Z1!N)uJ&ip{Kf1 z7}Jx=Q_I7iDyO}t)ymo#FSB-5t*+Z&OY5v^v~9IEa%R6;$C;*T-L_TxwpBT&uBndd zVzyuMURGD-t{1(R(1*Tlk-9FY%GZ0p4vs3i_*-t){Po#-vmw9UjsJ@B^OWm1THU7S z);q0Mt*zWHAdoToGI3VK(BZ~fM0g#T+;F_PhR3cl-pQ#Ywc~T zQ?Iq#oxol4FpoVfA10HXdTMqaPnNG%+qITgt%k*FwbfC*CXY+i>eXJY8C}U$F~WMa z`pYSOFGeH9$A^ywt?tooqdT+IYc$o&v)(g}XKGL1IC_r6bW}*{C`f7+Brt`$9^=E< zDDsy4uJf3GS$sk11Z#=3d&!paYVABrlfi8EkPYpoHSEsI|-lHtcs@$!7;0&y_%$9Wqyt?TG*?|L2v(|0BIB-<{zSQMZa?a83 z202w&%j1rMD&7Wff7!aB)o%2-wynoZP+S`upjCZq<6ux4q;PDHjN``~$CcF8TTUt% zA4>6Hg7^5p_vIA&8Am^O2J|#>+h$L1q5hlrT;bJS+ee`?Smmky^_LpgJS->3pDW`w z+I~=L*FEr11I(iv9?Fip+`zh$t(H7LaJwDfZ!9%EVJpyJ!lw7fewUteG-fp z6Ov&@oyTH;lryrJVH&N3V}Gng9KvQEyx z{Z(bIi?j$M#yvZ?-q zeB>%0ms~b`qS>j}n*Q@Rh-+((upgZ90hc$=r!HQ6F1|8Hu9)VuQyeswjX+9F`WEc8aJ7HE=Y zm;aWrj#K`#C{j)-U9?Je(aJmf(7+E$U*tO+r9|0q-)d`{!ze+dOx5#ntVf^!XG5v9Ee zfIM*4v-+?IR%?)ISRYuI!Ls^kp7{Wxa$uKI`b~&i3Q-$E^vyv=rPuTLM*S_;wzg2O z?DT(s0n{zB1hgKL!x6XUE-sGD*rMB6S|gtjNVpx*U6|<&)C+pxPLWw1=&&I@pI-Iq z>%M>hN-ysQINYNQWHooB?c^qDoD1knbG!>UMSK zT7x=LTF^%^gCY~5GIbF@LWkrK=9RZxgJALXA)G8{O~vD^P)Hu3!b87mzyl72RQyVb zhsphkV$~!LeFTNV$KQ)0mC0LKD{FJn9W46+D{o7UL<& ztAF^$!vii~K_7?yvDear)S81uJWL!&ZMkV(oxGA#kk9X0Z>9ucWcvSACf>ci>S1cM zNF2^t&5hZ|s1JoRi;D^CEG|L`)oVT9EG1`EWYw~fA&?Z&W!LYt&@!8h^inKBL@S9t zlganUkujp|)^x2EQ`elRv-q}TShA$oYrb^sDQRR*dqGdPafj|fjV{ZbBLkC4Kjk#e zpIazr!?eGF)rD3RJ`eN3QgsCZX@DH-;VcZ|u!IIHmvZS(_ zvp9bp9|3cze8~nATNAcp7t>%|UQHO6#6@b8l~mASF&f%TTd4qRr_uu(*uxn({*k~@ z&RT}3$Y7U&vzFaTLHA}hvl|mZ4opg%l7oGD49Fx8WOB_)Z31NV_W~#7fki+e#3ENx zZ>4~rvYYvL^KXjXDTpVxWqr-k&knLW+}IbC*2Yy1{bg02{cUD}c>VzGP6WG_ZM6N* zqPF*ATm{qv-T|r-th2rStABt#oaGcoIT=g>P2~nz;JO0Fc@FLEUN558r=r#l1ychV zhd%)v<)|^!GU#@XD&0=see`W-klQQ-dk2LeoCyNpfX0&3OVYc<`d0adwF|I~OxMwoTaFH;$_o)A(@ibr@BsvwqM1~4?B zOB3NBvMS~=)DDakm1ed}&c)=Wp?ot85LrJ02ILH+o$kOi0`icClHMY5Mrai2qW&Xa zat|N+;+Nb*<#!%0e!E;o`EdWa>6?6T!V_N*2xp|(P3$aQ z!~*-pXZrP<-ez$DVkVXYqqXmfrAA;Bj3T4xhjVwAHJUA_^(hQhzsQ0*zklvj^!Rsz zAxa)Xw9XQY)i&08S$A4^h6q^BZGRYPP8u%X6K0laI~kB;YcI?Qk`Oeb%jh=DuINs$ z>+47PW8xHWM+3OffEJleeV9Wem;h+^gRs=3wOVUdJ*-w(e52OvMG$A~@Xb z{uvahYzbJ$A&#+%X$r;(YtnM<5`Np(K5MUBaUmvcoS%Z&v~lFv4?93a_!i{z3ff6j zVH!VZkca^NF%GB-*KDGdO>+$ON0abAC^{gTV{+Y`OG90nI*!zFaQ%W@&zSpHpiXZ* zEoZVk15umWq*0fHP=;eguH>aG3{o&wan`?dF?ID4jJ)C+9F_OMJX%ldkN9hC48j~{ zEF3b~wE|Rh4*&9BK^-Eia-si?*!)`t02jFNQHrVzUNIh;_y(HkX$t1TG+ z?FFbV3u+KroByb+0l{+j0c`1W0dVtLc3=g$wLH!`MlH4v4AS~-T+8s9${ID^b`&tR zasQ$fPzLCdYCZ+f_T`{x+z(J^V>|-o0mku;a(;e6P-=hf$|@+vHBU>36-#eWMcX|u z9xvg1m(t1ruDN3IX0Wsg7;_R&r(ZzPKQNTdrmdtQh;&o$BI;q0;XN`nfQZIMI*|3! zG~M;{Ea(a{vaAs3THRZ!!5ddJmRc2f3)YjkI()HbG+8@_)o=4wir{ccMqF(yS0QMt z;?@eMs@0^y>MF2%wQ6MR4rx@RtH4;~{~m4mE{c>$l9Dx%o)CF6B@$^e4ND84y9iN? zItfH0MI;jD1b)y;^5GO(OX*3j11KXMQ0Bl<6#$?q`xotf;QO_#O5X;z<0!X9C%;%u z^Zmz-5_#lM+g#fyfKA30<=I(9~ueOl*HHBhzGN-n}*Q|~l8x}2}4UVAo(DCZ49Zh4wEX^{HR#D)}jYa^MV7eaM2s47T!wl3$&%>fXk=ItdoqRP$ z7iKgZ;L`};!eVvsFN?V>;-BuK^?qSyCaT!qcX_pQU8IiaJ2yIiuAB*-Rj=6%OAt97 z->aI=^HkA7C%J|%KGaGc2Oh^$N7Kn4MgK{Be3IKXpXmg=`VPF|j>@PkA`BS{T6|{} z{C@b(sWDZ;cV3MX4TckE8b0Jyo#x4@Znw4%&vu#K9*9UtrNpBqriO~@8ed%PP6rcg zs78HN1Tn;^VH4m2xWYxw0^!tLJ|C64IP&P4o^^>T>6)YcH zwT}c0>c4u$EouDrV3IL(a4umB&OQyO(_8`K0=fvQAaayeU~lm|Ex+Im)Q7+X z88SgTPsT{t!J04U!mK!`b?DGo9a9ZJJbbPP5tgo@T-7ruM1;wrHAZa~ot}t-I;zSaRVziMxK+>L05T=@J|xVC z#~C=pk=zEY^8mCCjjyL8t&?7JwotR0G5P~$ed@K;r4-D1N*j9~)~&vQ26Z1rSU4Ly zen$lL2ChK7EAusA<;0c^3ubPyFo!ui^xQ*yiZcoV)arj`=iEqyW7|>;-L*+u5NlaR zSiC?WC6o~LEsy|CQq9XCeuk&4Kn8>H$vLsFZ{k9kqv1^{tCTBQ{pmk>9NU&FAzdyP zW*fx2Mr=o|ThOi$F7!M7V$pJOE^W=p(wv2Ol$gNZ+j9FoiO1+9K=tu1$Q7BaTCvjZ#-8-4QXKreI0e>SwJzSUn@_f+=I~MxpKi+R`ls=pv%ck;{-w*}7NyUZXqdzIiCD}=rw1JiZQS%bE+Xb;HcWHWr*wUHaVL(Yolg6DO)L10 z;IZVxMKf;n>wLmHT+T#D(cL_-x)Wk*+RECZu7zh1rPCmTXN1kOk0?=;RN_NcpCHvXd`q%cqNpagf4>ya5xwT=Kop`6b+e$;6sedYE9zC zji_V6{suPO`>WWaSdMYr3&^FhQ6X&4-~ckrR%gMv77zP6d_|cGhyCEhZ#}2fYDH z6IWmXh(5?X-T$L2$g!bsoKllW8!?^OYJf~%=^s0^&{K%y|lIs#N+@MOYqvl3OKvt)fV zSG2;U3j~^EGAi(TUF)oS<#Z(jC=%Q--q-9p)Cc1ER%k67Vx%w*3ySt(4J`3(u0Gc_ z1z%TxT0+`rHlE@ncOtm~g1*7dOVmLqWrcC7))6B)*H3{cK3MtN_G zpo?fmN9bH=W;;Y6ftdzl!U7Go-8uf6Tih{6i&12A9um`V3D#v<;1FxN@dJ#23#ho+w z+&KU(ZxItojmAGAwS{DYKrABC#Fl;-Ki*Gk`fW`_0Gzs(e&1e(So@CsJ~AM99#aIq zG&C!`5N3pQ!dyfQ5#6K8Q)p0sg9UX)SmNr#C8>o$hhmr<^CR+uF;QtS_aBN0dNyix zXc#A?2DVOjJ6&`nDrwl;kOg;+LH`+!MiAMzarA?v*G$Qpa{7}ydrc;a9L~?H_y|+N zI{`|9ID^xY?(8*$MMlL~+3tVz|Amg?Gzp>36+&(BHzD*0z=`QFe!LNafJ?LKL(CR^ zFNm7b-^4@8(&}&FD9lK!F~l8Cv#j878NY+Nzs3m_d5Q_`PsIJrN(-N)q`4BBcaPwO zVY3{}cjI-+XB|6Vk^$CnKKYX_@ymY^#Ws04A(E2rO{PFnVgkS7JFALn4Bt6X;w3eH z3+eCgL0VK042PSuIFu^2aWo&hIQ`y|nci3sMwU+esEe*y1Mv|0y)F}Ijcbx{g zx)D`F!7>6$2}{}5SOMlxLoX?G{5%u2BnwD*Sb5jHW(Uc;uIfNE6HG!dLo{`ai8wSL z1sO4)iAG*)%{~fyfJu$IxY@ zyU6ceHECFLtY!4p;$q^gUj&MhEG;8mqq~P$jkv3wlnL;NN`(s0)kDF^qhMEBqj~E5zS=2>l~w_bBnVuERZ7sJ0d=@%xF5#CbPqu z6dG8R;I4)U{1{hgUWx5)uz~bNMLBAhCFTYj-a|tozmwE`1p+GKzn9jk0U94%kEAtQ^Wdm&ApUo)5FaC;qwec<3<8 zSN~ZIM8An5oY+puMz)JvZJL+IM(77gnP9YtKf*DvPx512cqjQe0W}kN#J|Ez$O&aL zaD{Z6y%qSgV;+mF#me5haj;mPl__4@F~;w4WEt2vx~9L2;}N|es++_AJ*ouy2!Y&T zBuZ>r%teOP5Qo?^l;3x{R;bD8Bs`6ezl4IOi7s+FW#>_<340C!gaeKVARIFR1etVr zS}!AHz`Q|boH3jJoqghjLF|Tc8U2j;RXoF=2!q z>+Av1$SO@xeStr{3NPRS4t z(jU%Jm^IsiWVZCLu>QL&7Ey!+vx|t?2U#Cb##1remRaNk>R)BCWB&dc&J}D>*(459 z$k&$qB&6p~befp6nD=tU?%4{wAbno^%56(?G-o!05BI9>7qvs(dhIUFVMTi)TlU~07MYi8p%v$ zGaYQkYaqbF+{K=EB&jButHhBI%5WH=A3*@gaIjM>Yu5b|9!ghOFam)$2wW~&0LDP()6)aQ(kXPI zl9*Q)ACpavOP-CScQC_7f!vXQXTd-JGUi%x^&~IHy79a!K$$(w%}LDKVEPqsa%MnFM;#*ReSf z8ziuWvf~0FBMAt*a|HJqm$@u01(J9}$=%>mV07N=GLtZ>9s$+UBM!3I*&d&^;_cMiOMtNP@AY zF|tUEgpoiE!;eiyiBlvtCa!S5l=0XDCBu&lH&T5ai9^OFjUG{480feLQ*#ErB2crq z4RJ44Ipv(-1d|V8e05vZId?S(y8hhJqbqpI-V!0uQ4Gvq@3m_B=(f5KF<#U1qRq0# z4CKH^Y#gy0Ff(FPO5}yJ%TeG~&az4Ags~ABOvaj;18dV>gq*;`AXA;@2jeFO!VU)? zfl}a8Z`1;r|Jb29^>JZVa2yW%uepcag+_Od^2Qk1E~`YO1u}y93~6+x<4$8!XgpEd zEf?8wMjIRx(wePgHz0L8*P#LI<&^~nByg>MT|tukEwH`*35xPqm^Dl^B7olFRVsZb z8A)gR9*!$xl4l%MeuG!DKrCnvsc);G9l%Hms7kKwUB_-QZQ#)koz9k?p=6@?PVLEC z2ZR`hB$v+ruXf$db+9yZi4*5}w!}u4F*Krxs=TMb2w6Tp4l{#zJNU z1qAp2Hq#N|z{W}&8YQxGHC#3@kD|1&%I+&?FMXkM_Vt&lL>aG~IzO-fIwoVje*koJ z8Ex@CQQ;D(oW6N%bGpCFJ=CoAO#~Cy%l$p5eAeV?FkU$4qFPvlJWxH^@ZJBs>$+D? zU79~X|I!?3k31R?7+fUcMv_2dJbEZOij(N}QKNabl7)gsPVv?oc$!1jzj zViWf7phlh5;y>J%I*E@YtZnlz+VCtgfs&p@lRybSBQ#w;96yaT?2Fu##T{V%@1Hga z43SL7sbt?CeM)syhDeGWO71CgKk~~VC_!0~yG@e4NgR|}M-1r!W8lQ%;$tn+(hN2|nrD zV7;m>)|fNDa1J7bvIqPA8oJt9uWf`STC>e-p1>Pi7OCW1gcOHafiik2fbrgMUpz_t z`B|=($PTPcf8Vz09NP4;aAEL(c=$9vKF#5c3EEpk_(*Vo<>`o33j67!$bNz)8ee5% zAkx|hQ*7Oa4*<{A%xpTax~6eo7I&>CcR@f6D4NpTr_T3~3;?OPql~U*0H#d9-DCN6 z#MuWK{ha~!tG6eSnw}Ah%{FJgJZjAr=EIDvpV^r`^SXp{YH9{c>XI@V%Y2~(RI~Q3 z_7KiTGV8{x*a3iL6gJBuqnU1kXYt%WrArEWg2(#zcs#Cum&Y>yr59^Th!UH>b(p=p za0&7u%z)bPGZ(cf-UrQg%$|Z$qzfgbRCd1r*812qGbAIRV2Q%Cc~gsp7>NIzM?Yq< zeSsM*YNOTQLoTu?6tEvRxJ-cojYEPA$(?}Q@XJ&HZffb@vz-j0R*)HcSL5a+d!A?U zFSn0DMzf#i{sD?D4kC|(Joe5&n>li}p2ivek+c%MMbu5gA|pgbC-%xfGZA|ivFJ|? z(w$@2LWsB{0X=P;9dOT!0CQ#kim}RA4*-Aw^3c%P-FcMfJ`7HW@gsCjYP^| z-#?HpT;RifT>y)1sTYYOL4K4rMmoIGQJ_S+iKV%yl0j#Hx%8&v?n69(#6?$S^wq63 zpc;|igJg%;(H=UiqW=k|a!980{n;z*e%c5_*-bYsTrquwC(&NA!wz~(&2lTpj{0!8 z4@ojg7K?9=ajLm@*p1ABIJHNoVzz((CBtig((I-uJQ)v;sWd|d8`IzAqll^hSswih z76)03qX;ug8(>}?^2G16AS>#BiUMpSd?Fkpyz{ScR+9MT(JR=K51)-BIqYPiac%-= z$QxZSH-DKld<-{Z;|_J2wGWI#ttNWS-uXR={T$|s{@1uCOar>~4_xXYxxIE5cz``E zl_C@>-Uh>M2>t8~WRoBC?U~hn;fdqV%pSwPC;Io1&W3r6qzQTdMu&S7b8&p}Dmr8f zjE$j%ZsUD8Ci;7MFHbRU5Z}gXq?P_53Bciv617o*XwWu z{Ogl?jIYn`>@mLZC-r#$%#2{I8Ddz>3c4i_m7kvO*Y12!sV?Res&DIe+m(^$;|YAmTIq2k#t&BnFy0IEp%@JOAjAE#Pw+AD^ojz+t_a zhwG5uji~|CK=7J096x|#2k&&?@sUBAQamu5HMlJ!jqT$O?F$@dP|JqmFAxbfv#s1_ z5pGFwE^?DKVmjFYoR7D2#`{vv)|jRYUIT?0)B8?5K5Bo*xY~qfN9%Tbn!AAzUu`!x z;L!?(Vc{spP@o^@7KY3cwmk(Ke1R0a6>19Z$ zi0NYyl`A5G2l0iDS-o(NP7J>m>gk-9k z_iUA&N(r2fFo`j!%&&M1col(A2zI%Q0iDER6M+JHkp^6>SI7f1eGMNRQQsJT(Qlu~ZK5h;8kV z-1_@C_q&wWL?EdL`T7dl(EMcWDS#gA{I#SOtawJP`)(weO$P1*|j}z{bB#u7GH`2 zlg@`o&t9~A&lcQ<62{y|wxD~Fp-e!OLhXcM38)`BaR5${cttT7d9AiRc=XV8^3+^; zAAyj0Vl&6NlFVEO#bTb~GsZ23tfAq?;D}VE1*WcIcUxWFpdyYX({HWL4P_t=>L!x{ zAEj%EPj8f2A+158%x+*Fg~{vWjXu*jT)*AG&Rx9S4MRu%JB(Pd!TG)n89*f2nA8#V zHq4Tb6GTK*jyzLjxzShy?}QUfNN0)_Hk8Ao*Dpsi_z0zh`-opW)rG4HzrOg0|4#9I z^x7<*sf=HIYvJWr=Pxguy0q~6#n8ewGd=)!AQ=Oih5}rL<$HnPFyzX(_`qgYnw=#e zDE%KWgfI>7qA+i2y!B z2N^GIj0Jc{(#*PYlG;H38k?Gu*GI`x#as^v6%i3kga5)#IXE+}|I8!8u1YR)@0d)@ z?Iw!;CDh2K!9^|(QbmSVXqpg7@gF>1Kw8)yZMpDvN$pD31jhRZ#e*a&O(NxqsgI?Z zC8l944bX=#QfVs*?Q$b2Qwy<~TjPCZ`YihFue@T?4MBCh!!^xAz|OkU@&W`w#O%j7 z&&5@2*g*WhQYXGk;LXUk5%3PpNyIhy76-vL{|22JSTjB|1A3i_#?*g69_Zz>r_MhLzrSeUc&Tw*w%I+AqSO%nzh^eaU~B+eTi4hK2>u?lDW8F6|zj;a+g;3 zL5daBq}qK8F+iT%vhaIKey5Y)dq%G>r||-)z1;N*s~r$v%e0kI_wY@3A7Fz6#|?Qm zHgG;jF$x>iYG{gt}Hkungi&!UD z66U^HM*ZKpc7KEd;v)@Itp5j&w|Rk}tdRDAbu6M_f+%*NMbTzk|2odeEzsO-Wrw;8 z^Cz0M){?3{f0o>Y3aNfHG;phAkPNdsj~%1YQ01xl;W+Nz z$^Ye(3oU-~lS^N(-lZ?jFry4Ys&w>jf8`>{1>3>klNo*Gq8+ANwHxO7(lXnjwHjL2 zcRrwt_FjuS#fuiFZ{9pMcLL7r%}v+6dGiSzKM@@t$MJC--+dB>GmV{S*4|XK_~a-1 zV{2w!I*z6~%v^6MK+7GviIe?$JQj!UzK=0F{XbFQc*xIb{l`2H>H?ldQJ&O)fhQ(V zRB}DtthQ=hI2o8{M786Oc;5diD+>S6`K8miJxuo-UGt6#>_0|$d)O7gv79Lvu$dgX z3i~sVHxO}Gn32XSC4MC*bF0wcc$I7=E6?b|3DLQ3BuGMF5GntQy_0bCUqW$+Pfhkn z?V$$)u0iqMGb?8@J(b2U=;XcF&QZkY06ub8?aLVbDVH38SN^!YKun=H@sddG4)92u z=c0Mn9rE&XPp8l1DgGhsk6ZQ@Kh++{brj2k*x<1LxkT?rO05|L*I$04i zwBcN}?}a_1fE8AdR&p=ytXh1L4Bt}A3@aG_#u9Q6=roYqZV(8-QJKQ(bFPb2= zJJZ6DXIfyjr%V&=Y1_w{}c{Vbd7`dWpA}J39q%u+QCk2ru^X5%$COfDrj_s;kaKzWP-4j zsA$4V?z=uO8?E_{8na~>nLbo|`ehb}S-i&L42zJ(XIU(w2n(`@r_%xO$EX1EnU~I8 zRhsLB7e9+N4ic5uRLENkM7mTa5`&w3=$k;pBe+N2y%OfAX%Qfjw@J!7Oywm4#+90j zZ4FAW5E7(`PJLtHi*di3?fe}URTP!t>wGzjywJyNW_*&DjYDD8lTk z5~S0AQGP@l&%|Hw9?n$uh_xXbz>>Wvl}Y(+61h#7VM3--)BK??o+QGZPMWl%s)+c!_AuAIE8Pbg$QFH=> znU@DWPXOot2n7Qx%w!z?qt}6v&=UL)`*FM%?+{~VXfZwI5li!~|kv~{Gm>;A4 z!#Aw*U*4H~dh*4Ibbfs5{z*TdD?X9`)YPH;VL;@+b5zX85A{4W3i literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/config.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b0035765e3efc177b031e2dc455082db955a172 GIT binary patch literal 9958 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 XR0i?Sl}w`o-BpY_GHSiBboqY(L(Bpv literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/ctx.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/ctx.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..680abd79fb60560254df8cead8f9e80d370b2bea GIT binary patch literal 13928 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 CpNVz= literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/debughelpers.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/debughelpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd0951867f0c5101e1075e0d40820fdabc9af349 GIT binary patch literal 6567 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/helpers.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85576a81f08555e6284679750852647de00f6870 GIT binary patch literal 33027 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/logging.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/logging.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad400230835858d5a4a6a9c427abc7fbfcf020bf GIT binary patch literal 2348 zcmZuz-EP}96ei_=#Yx&?-MXuBz>35`s&p;T4n`0RZIZS?&=p9x0^SOX7AaYdEV(4r z#6jAd6xj9vyV)D`33juqUF{ikyQ{uJuXYY)yU98Mrby}V{CxbrBi~+LcK`l!<)=TI zg#1I!T@{#r3qP%35Tr*06;49OPS2q@uOyXT#onvED%`6{ZCvlw;ayGClg7B&Yf>WX zq9K}Z$QkXmL`%4DNY9m((UNSzleTP+mSMFbmd@xIg`I7&3>K@RazHvOxq-lLm~egQ zC0P{3Y2>~>f4Ocq$R<-2M?=$Pf4yb5Zhn1}4W`TtC40h?L>kSEx#bf1n<>X^u@|EBC5c_+R5+thcY;1afoLF zM}ZV#!}3H~oZ1tcrObjMw@^J zlnL8Z zvw=EJ;dnQT#;leORc+W=o|X%<_pPl+rt)~Awmayz1o-5uA=iEDpg-H`Z6zpqz3nYF zJl*Tmipw7*UQ~EGEt<1^x@e)8c?4oE>J#93Y9Oh42~g1pa)pmD@Rftp2$3ck3Q&5q4JAHlw<=Cp>4&sGnP3oUw~G9fwpa^ZqH(5 sq$*mAsZHWs^0sl?3YuG`JhtIK5YeB)P<1fzCXDS$d%1blrLe003ulC;^Z)<= literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/sessions.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/sessions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b90af75b8866fc411ce34652f6f5d870c2cea7f5 GIT binary patch literal 12195 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 DTU?5O literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/templating.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/templating.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86b5184138bb29f5f3b1b22fcad2421606b3752d GIT binary patch literal 4929 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/testing.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/testing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..390afac193cd536cdb6c0fae873f0392d4fcbbf0 GIT binary patch literal 7832 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 OXS7E%-rfFlN%>z?Hm&ji literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/views.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24cf75663f8ce1bdc88c2d7b1853415213d0fcea GIT binary patch literal 4737 zcma)AOLH5?5#ARbgeZ!VY$<-k8C9YJ;ZPu*RK+QjtP-P#t%^*mBw4P&Q7x7`17gX= zE;KVMiY&;LGL({h$t^#^hx~(_a>^mUV6QplFXWW3XBPkk%1M?rgWZ{)o}TWnAH!ds zKHd2HUsrxFE?Cw-tz*v;-mjyn1Rb}!7Pq+*+e4@8*!1qk?$GOcwk0au;}u@zHD2dS zyunZH)+cti`l-d2`RNxHKP_q#w_C^e3O|GIGhzwf4ScWiv-mzMJkb#KiG$Ho{M-Yp zbw2wCHf=CG{Wwtj?Wd7AQ0Dua`O`214+oKA!<1*SU?Z76jkr)O#42@VCs2YjvzA4P z8buPHJBLgU1WOZ;MG3pP7bLrByWrIc)6t=fb_cq{{`Nil#pXwwQ~G;B91E?O7QwJ> zHtxhxC=w+)>^Bc?t}`VByL;!xt?dW5SU;5zNeae=4x(7K8~?I#pq8E2qmpfe#t*#PEECxf^TDPVWofG^#g+4w%ByFxy*Xo!>G)GS<4*P_C-Td^{!{+1pQkv$X z&lVN7rbOIdXGt&=3(RPR6gra$Yknr;IAxdBr6#*&CV|+4hq{@^+wnGR9hScu2p^R;yt5)j%ZdFwFprM3dUM2vZqo!2&jlv)$cb2cAev z3aTiMXX+L(vyco%(1W0W$N{k<&6^cda2aSw0j`{_!DA03PC#}i%JRHVgE)g9_ljzOX5=Z@0@>^$?mkwvW!VQwaJ~ z-%pxw6Sp=@4BH^TQti=UzPcDyZjq`SbXMi)ZNhkaks>s+M1V%=g|<~Ox|h~V`=!%& zsVI0+|IQg(dzQR9wqH5EjdusX&a(?NdeeHm{M;LRubhefo%3YLV~K%owGhDKnFC?Jxc9V2O{NBZr-_m~Kf`N~8H z*||x9Gj3)HVew5_v&1NvM7oRu1eb@e;cA}G7Gk0a0;o(50?FY`MZ%kH9HP+BG7Aw# z5L4$mo})5^+08>hp!O3q^&@nzoIUH6^~(N}{oENldjP-~?=YOb-E#5N za&r%EfU;&EqUiEpNsi}!*c_lSdmyj%sXyol}*nnI}puV1#0-Zk(oqksEq zoT9E!*G$=n!lp3~M0wr!DdqWo-thgRZ1jD34t(;O@AEXoOs$OW`8#DD;Rl&chp2}_ zzpTkxmD~+um3zcYzK!J)1+;})s>p_^H1f9G`J55k93ZcilHSD<^)5QAvFcUrs$Iun zmTSdZ9ba|(X!-cjS`GOQs3on*mwo>UVp4G&`5ukGPu-8HBfA)N=ckM=iz7)!!{o)s zI-}ENjJ<`X=%xOF=i={_=hSPG24=R$yRkj}Du(WOo%z!0BOGw|MZN32v^=X@0S3H$ z<#Q7n=^PIaN8;#r_%3Q*Qz%b8WKPus{E%c&JPSFDs8Bzk@8SrB{}Un%c2O=7MFG>$ z00L4~(deCEst79D(tzc}*>lGB*crPMmo715cfTg@Yj+t!mc#4bgPY7hx<)A`K+D3N`)N zfz~4`^iiIg5=-SZl*?3my|9gp32v%&fz34VPSzHVwRsSw+T@v zPPd}{TDEKxrP-E_OZP+LiFMa=i~?Rm3#E|jL_&x>juwLy3pW!Fimc>~xr~8@MO!B> zaV09s%LGs{jiNJP6g51`Q7P0YO*kq>0}|r_Q~b2qZNxb7ETHVV&Z54lW@Z-`7O-9q zSFv8NTmTY{3kqWUPEig}GNJG}K=ekb+v}l<2X!fpYO|BY6*u=yiX%jkNeFbhxBipTI z1{s*WHE@uD$ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/flask/__pycache__/wrappers.cpython-36.pyc b/venv/lib/python3.6/site-packages/flask/__pycache__/wrappers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95de6d8795b4365480c0e2a73680c93876a464c5 GIT binary patch literal 6738 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', + endpoint='static', + host=static_host, + view_func=self.send_static_file + ) + + #: The click command line context for this application. Commands + #: registered here show up in the :command:`flask` command once the + #: application has been discovered. The default commands are + #: provided by Flask itself and can be overridden. + #: + #: This is an instance of a :class:`click.Group` object. + self.cli = cli.AppGroup(self.name) + + @locked_cached_property + def name(self): + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == '__main__': + fn = getattr(sys.modules['__main__'], '__file__', None) + if fn is None: + return '__main__' + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @property + def propagate_exceptions(self): + """Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration + value in case it's set, otherwise a sensible default is returned. + + .. versionadded:: 0.7 + """ + rv = self.config['PROPAGATE_EXCEPTIONS'] + if rv is not None: + return rv + return self.testing or self.debug + + @property + def preserve_context_on_exception(self): + """Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION`` + configuration value in case it's set, otherwise a sensible default + is returned. + + .. versionadded:: 0.7 + """ + rv = self.config['PRESERVE_CONTEXT_ON_EXCEPTION'] + if rv is not None: + return rv + return self.debug + + @locked_cached_property + def logger(self): + """The ``'flask.app'`` logger, a standard Python + :class:`~logging.Logger`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will be set + to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be added. + See :ref:`logging` for more information. + + .. versionchanged:: 1.0 + Behavior was simplified. The logger is always named + ``flask.app``. The level is only set during configuration, it + doesn't check ``app.debug`` each time. Only one format is used, + not different ones depending on ``app.debug``. No handlers are + removed, and a handler is only added if no handlers are already + configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @locked_cached_property + def jinja_env(self): + """The Jinja2 environment used to load templates.""" + return self.create_jinja_environment() + + @property + def got_first_request(self): + """This attribute is set to ``True`` if the application started + handling the first request. + + .. versionadded:: 0.8 + """ + return self._got_first_request + + def make_config(self, instance_relative=False): + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults['ENV'] = get_env() + defaults['DEBUG'] = get_debug_flag() + return self.config_class(root_path, defaults) + + def auto_find_instance_path(self): + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, 'instance') + return os.path.join(prefix, 'var', self.name + '-instance') + + def open_instance_resource(self, resource, mode='rb'): + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + def _get_templates_auto_reload(self): + """Reload templates when they are changed. Used by + :meth:`create_jinja_environment`. + + This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If + not set, it will be enabled in debug mode. + + .. versionadded:: 1.0 + This property was added but the underlying config and behavior + already existed. + """ + rv = self.config['TEMPLATES_AUTO_RELOAD'] + return rv if rv is not None else self.debug + + def _set_templates_auto_reload(self, value): + self.config['TEMPLATES_AUTO_RELOAD'] = value + + templates_auto_reload = property( + _get_templates_auto_reload, _set_templates_auto_reload + ) + del _get_templates_auto_reload, _set_templates_auto_reload + + def create_jinja_environment(self): + """Creates the Jinja2 environment based on :attr:`jinja_options` + and :meth:`select_jinja_autoescape`. Since 0.7 this also adds + the Jinja2 globals and filters after initialization. Override + this function to customize the behavior. + + .. versionadded:: 0.5 + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + """ + options = dict(self.jinja_options) + + if 'autoescape' not in options: + options['autoescape'] = self.select_jinja_autoescape + + if 'auto_reload' not in options: + options['auto_reload'] = self.templates_auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g + ) + rv.filters['tojson'] = json.tojson_filter + return rv + + def create_global_jinja_loader(self): + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename): + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith(('.html', '.htm', '.xml', '.xhtml')) + + def update_template_context(self, context): + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + funcs = self.template_context_processors[None] + reqctx = _request_ctx_stack.top + if reqctx is not None: + bp = reqctx.request.blueprint + if bp is not None and bp in self.template_context_processors: + funcs = chain(funcs, self.template_context_processors[bp]) + orig_ctx = context.copy() + for func in funcs: + context.update(func()) + # make sure the original values win. This makes it possible to + # easier add new variables in context processors without breaking + # existing views. + context.update(orig_ctx) + + def make_shell_context(self): + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {'app': self, 'g': g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + #: What environment the app is running in. Flask and extensions may + #: enable behaviors based on the environment, such as enabling debug + #: mode. This maps to the :data:`ENV` config key. This is set by the + #: :envvar:`FLASK_ENV` environment variable and may not behave as + #: expected if set in code. + #: + #: **Do not enable development when deploying in production.** + #: + #: Default: ``'production'`` + env = ConfigAttribute('ENV') + + def _get_debug(self): + return self.config['DEBUG'] + + def _set_debug(self, value): + self.config['DEBUG'] = value + self.jinja_env.auto_reload = self.templates_auto_reload + + #: Whether debug mode is enabled. When using ``flask run`` to start + #: the development server, an interactive debugger will be shown for + #: unhandled exceptions, and the server will be reloaded when code + #: changes. This maps to the :data:`DEBUG` config key. This is + #: enabled when :attr:`env` is ``'development'`` and is overridden + #: by the ``FLASK_DEBUG`` environment variable. It may not behave as + #: expected if set in code. + #: + #: **Do not enable debug mode when deploying in production.** + #: + #: Default: ``True`` if :attr:`env` is ``'development'``, or + #: ``False`` otherwise. + debug = property(_get_debug, _set_debug) + del _get_debug, _set_debug + + def run(self, host=None, port=None, debug=None, + load_dotenv=True, **options): + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :ref:`deployment` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` + environment variables will override :attr:`env` and + :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Change this into a no-op if the server is invoked from the + # command line. Have a look at cli.py for more information. + if os.environ.get('FLASK_RUN_FROM_CLI') == 'true': + from .debughelpers import explain_ignored_app_run + explain_ignored_app_run() + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, let env vars override previous values + if 'FLASK_ENV' in os.environ: + self.env = get_env() + self.debug = get_debug_flag() + elif 'FLASK_DEBUG' in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + _host = '127.0.0.1' + _port = 5000 + server_name = self.config.get('SERVER_NAME') + sn_host, sn_port = None, None + + if server_name: + sn_host, _, sn_port = server_name.partition(':') + + host = host or sn_host or _host + port = int(port or sn_port or _port) + + options.setdefault('use_reloader', self.debug) + options.setdefault('use_debugger', self.debug) + options.setdefault('threaded', True) + + cli.show_server_banner(self.env, self.debug, self.name, False) + + from werkzeug.serving import run_simple + + try: + run_simple(host, port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies=True, **kwargs): + """Creates a test client for this application. For information + about unit testing head over to :ref:`testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from flask.testing import FlaskClient as cls + return cls(self, self.response_class, use_cookies=use_cookies, **kwargs) + + def test_cli_runner(self, **kwargs): + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from flask.testing import FlaskCliRunner as cls + + return cls(self, **kwargs) + + def open_session(self, request): + """Creates or opens a new session. Default implementation stores all + session data in a signed cookie. This requires that the + :attr:`secret_key` is set. Instead of overriding this method + we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.open_session`` + instead. + + :param request: an instance of :attr:`request_class`. + """ + + warnings.warn(DeprecationWarning( + '"open_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.open_session" instead.' + )) + return self.session_interface.open_session(self, request) + + def save_session(self, session, response): + """Saves the session if it needs updates. For the default + implementation, check :meth:`open_session`. Instead of overriding this + method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.save_session`` + instead. + + :param session: the session to be saved (a + :class:`~werkzeug.contrib.securecookie.SecureCookie` + object) + :param response: an instance of :attr:`response_class` + """ + + warnings.warn(DeprecationWarning( + '"save_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.save_session" instead.' + )) + return self.session_interface.save_session(self, session, response) + + def make_null_session(self): + """Creates a new instance of a missing session. Instead of overriding + this method we recommend replacing the :class:`session_interface`. + + .. deprecated: 1.0 + Will be removed in 1.1. Use ``session_interface.make_null_session`` + instead. + + .. versionadded:: 0.7 + """ + + warnings.warn(DeprecationWarning( + '"make_null_session" is deprecated and will be removed in 1.1. Use' + ' "session_interface.make_null_session" instead.' + )) + return self.session_interface.make_null_session(self) + + @setupmethod + def register_blueprint(self, blueprint, **options): + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionadded:: 0.7 + """ + first_registration = False + + if blueprint.name in self.blueprints: + assert self.blueprints[blueprint.name] is blueprint, ( + 'A name collision occurred between blueprints %r and %r. Both' + ' share the same name "%s". Blueprints that are created on the' + ' fly need unique names.' % ( + blueprint, self.blueprints[blueprint.name], blueprint.name + ) + ) + else: + self.blueprints[blueprint.name] = blueprint + self._blueprint_order.append(blueprint) + first_registration = True + + blueprint.register(self, options, first_registration) + + def iter_blueprints(self): + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return iter(self._blueprint_order) + + @setupmethod + def add_url_rule(self, rule, endpoint=None, view_func=None, + provide_automatic_options=None, **options): + """Connects a URL rule. Works exactly like the :meth:`route` + decorator. If a view_func is provided it will be registered with the + endpoint. + + Basically this example:: + + @app.route('/') + def index(): + pass + + Is equivalent to the following:: + + def index(): + pass + app.add_url_rule('/', 'index', index) + + If the view_func is not provided you will need to connect the endpoint + to a view function like so:: + + app.view_functions['index'] = index + + Internally :meth:`route` invokes :meth:`add_url_rule` so if you want + to customize the behavior via subclassing you only need to change + this method. + + For more information refer to :ref:`url-route-registrations`. + + .. versionchanged:: 0.2 + `view_func` parameter added. + + .. versionchanged:: 0.6 + ``OPTIONS`` is added automatically as method. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param view_func: the function to call when serving a request to the + provided endpoint + :param provide_automatic_options: controls whether the ``OPTIONS`` + method should be added automatically. This can also be controlled + by setting the ``view_func.provide_automatic_options = False`` + before adding the rule. + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + options['endpoint'] = endpoint + methods = options.pop('methods', None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, 'methods', None) or ('GET',) + if isinstance(methods, string_types): + raise TypeError('Allowed methods have to be iterables of strings, ' + 'for example: @app.route(..., methods=["POST"])') + methods = set(item.upper() for item in methods) + + # Methods that should always be added + required_methods = set(getattr(view_func, 'required_methods', ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr(view_func, + 'provide_automatic_options', None) + + if provide_automatic_options is None: + if 'OPTIONS' not in methods: + provide_automatic_options = True + required_methods.add('OPTIONS') + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError('View function mapping is overwriting an ' + 'existing endpoint function: %s' % endpoint) + self.view_functions[endpoint] = view_func + + def route(self, rule, **options): + """A decorator that is used to register a view function for a + given URL rule. This does the same thing as :meth:`add_url_rule` + but is intended for decorator usage:: + + @app.route('/') + def index(): + return 'Hello World' + + For more information refer to :ref:`url-route-registrations`. + + :param rule: the URL rule as string + :param endpoint: the endpoint for the registered URL rule. Flask + itself assumes the name of the view function as + endpoint + :param options: the options to be forwarded to the underlying + :class:`~werkzeug.routing.Rule` object. A change + to Werkzeug is handling of method options. methods + is a list of methods this rule should be limited + to (``GET``, ``POST`` etc.). By default a rule + just listens for ``GET`` (and implicitly ``HEAD``). + Starting with Flask 0.6, ``OPTIONS`` is implicitly + added and handled by the standard request handling. + """ + def decorator(f): + endpoint = options.pop('endpoint', None) + self.add_url_rule(rule, endpoint, f, **options) + return f + return decorator + + @setupmethod + def endpoint(self, endpoint): + """A decorator to register a function as an endpoint. + Example:: + + @app.endpoint('example.endpoint') + def example(): + return "example" + + :param endpoint: the name of the endpoint + """ + def decorator(f): + self.view_functions[endpoint] = f + return f + return decorator + + @staticmethod + def _get_exc_class_and_code(exc_class_or_code): + """Ensure that we register only exceptions as handler keys""" + if isinstance(exc_class_or_code, integer_types): + exc_class = default_exceptions[exc_class_or_code] + else: + exc_class = exc_class_or_code + + assert issubclass(exc_class, Exception) + + if issubclass(exc_class, HTTPException): + return exc_class, exc_class.code + else: + return exc_class, None + + @setupmethod + def errorhandler(self, code_or_exception): + """Register a function to handle errors by code or exception class. + + A decorator that is used to register a function given an + error code. Example:: + + @app.errorhandler(404) + def page_not_found(error): + return 'This page does not exist', 404 + + You can also register handlers for arbitrary exceptions:: + + @app.errorhandler(DatabaseError) + def special_exception_handler(error): + return 'Database connection failed', 500 + + .. versionadded:: 0.7 + Use :meth:`register_error_handler` instead of modifying + :attr:`error_handler_spec` directly, for application wide error + handlers. + + .. versionadded:: 0.7 + One can now additionally also register custom exception types + that do not necessarily have to be a subclass of the + :class:`~werkzeug.exceptions.HTTPException` class. + + :param code_or_exception: the code as integer for the handler, or + an arbitrary exception + """ + def decorator(f): + self._register_error_handler(None, code_or_exception, f) + return f + return decorator + + @setupmethod + def register_error_handler(self, code_or_exception, f): + """Alternative error attach function to the :meth:`errorhandler` + decorator that is more straightforward to use for non decorator + usage. + + .. versionadded:: 0.7 + """ + self._register_error_handler(None, code_or_exception, f) + + @setupmethod + def _register_error_handler(self, key, code_or_exception, f): + """ + :type key: None|str + :type code_or_exception: int|T<=Exception + :type f: callable + """ + if isinstance(code_or_exception, HTTPException): # old broken behavior + raise ValueError( + 'Tried to register a handler for an exception instance {0!r}.' + ' Handlers can only be registered for exception classes or' + ' HTTP error codes.'.format(code_or_exception) + ) + + try: + exc_class, code = self._get_exc_class_and_code(code_or_exception) + except KeyError: + raise KeyError( + "'{0}' is not a recognized HTTP error code. Use a subclass of" + " HTTPException with that code instead.".format(code_or_exception) + ) + + handlers = self.error_handler_spec.setdefault(key, {}).setdefault(code, {}) + handlers[exc_class] = f + + @setupmethod + def template_filter(self, name=None): + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + def decorator(f): + self.add_template_filter(f, name=name) + return f + return decorator + + @setupmethod + def add_template_filter(self, f, name=None): + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test(self, name=None): + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + def decorator(f): + self.add_template_test(f, name=name) + return f + return decorator + + @setupmethod + def add_template_test(self, f, name=None): + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global(self, name=None): + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + def decorator(f): + self.add_template_global(f, name=name) + return f + return decorator + + @setupmethod + def add_template_global(self, f, name=None): + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def before_request(self, f): + """Registers a function to run before each request. + + For example, this can be used to open a database connection, or to load + the logged in user from the session. + + The function will be called without any arguments. If it returns a + non-None value, the value is handled as if it was the return value from + the view, and further request handling is stopped. + """ + self.before_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def before_first_request(self, f): + """Registers a function to be run before the first request to this + instance of the application. + + The function will be called without any arguments and its return + value is ignored. + + .. versionadded:: 0.8 + """ + self.before_first_request_funcs.append(f) + return f + + @setupmethod + def after_request(self, f): + """Register a function to be run after each request. + + Your function must take one parameter, an instance of + :attr:`response_class` and return a new response object or the + same (see :meth:`process_response`). + + As of Flask 0.7 this function might not be executed at the end of the + request in case an unhandled exception occurred. + """ + self.after_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_request(self, f): + """Register a function to be run at the end of each request, + regardless of whether there was an exception or not. These functions + are executed when the request context is popped, even if not an + actual request was performed. + + Example:: + + ctx = app.test_request_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the request context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Generally teardown functions must take every necessary step to avoid + that they will fail. If they do execute code that might fail they + will have to surround the execution of these code by try/except + statements and log occurring errors. + + When a teardown function was called because of an exception it will + be passed an error object. + + The return values of teardown functions are ignored. + + .. admonition:: Debug Note + + In debug mode Flask will not tear down a request on an exception + immediately. Instead it will keep it alive so that the interactive + debugger can still access it. This behavior can be controlled + by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable. + """ + self.teardown_request_funcs.setdefault(None, []).append(f) + return f + + @setupmethod + def teardown_appcontext(self, f): + """Registers a function to be called when the application context + ends. These functions are typically also called when the request + context is popped. + + Example:: + + ctx = app.app_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the app context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Since a request context typically also manages an application + context it would also be called when you pop a request context. + + When a teardown function was called because of an unhandled exception + it will be passed an error object. If an :meth:`errorhandler` is + registered, it will handle the exception and the teardown will not + receive it. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def context_processor(self, f): + """Registers a template context processor function.""" + self.template_context_processors[None].append(f) + return f + + @setupmethod + def shell_context_processor(self, f): + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + @setupmethod + def url_value_preprocessor(self, f): + """Register a URL value preprocessor function for all view + functions in the application. These functions will be called before the + :meth:`before_request` functions. + + The function can modify the values captured from the matched url before + they are passed to the view. For example, this can be used to pop a + common language code value and place it in ``g`` rather than pass it to + every view. + + The function is passed the endpoint name and values dict. The return + value is ignored. + """ + self.url_value_preprocessors.setdefault(None, []).append(f) + return f + + @setupmethod + def url_defaults(self, f): + """Callback function for URL defaults for all view functions of the + application. It's called with the endpoint and values and should + update the values passed in place. + """ + self.url_default_functions.setdefault(None, []).append(f) + return f + + def _find_error_handler(self, e): + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + + for name, c in ( + (request.blueprint, code), (None, code), + (request.blueprint, None), (None, None) + ): + handler_map = self.error_handler_spec.setdefault(name, {}).get(c) + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + + def handle_http_exception(self, e): + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + handler = self._find_error_handler(e) + if handler is None: + return e + return handler(e) + + def trap_http_exception(self, e): + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config['TRAP_HTTP_EXCEPTIONS']: + return True + + trap_bad_request = self.config['TRAP_BAD_REQUEST_ERRORS'] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def handle_user_exception(self, e): + """This method is called whenever an exception occurs that should be + handled. A special case are + :class:`~werkzeug.exception.HTTPException`\s which are forwarded by + this function to the :meth:`handle_http_exception` method. This + function will either return a response value or reraise the + exception with the same traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the the bad + key in debug mode rather than a generic bad request message. + + .. versionadded:: 0.7 + """ + exc_type, exc_value, tb = sys.exc_info() + assert exc_value is e + # ensure not to trash sys.exc_info() at that point in case someone + # wants the traceback preserved in handle_http_exception. Of course + # we cannot prevent users from trashing it themselves in a custom + # trap_http_exception method so that's their fault then. + + # MultiDict passes the key to the exception, but that's ignored + # when generating the response message. Set an informative + # description for key errors in debug mode or when trapping errors. + if ( + (self.debug or self.config['TRAP_BAD_REQUEST_ERRORS']) + and isinstance(e, BadRequestKeyError) + # only set it if it's still the default description + and e.description is BadRequestKeyError.description + ): + e.description = "KeyError: '{0}'".format(*e.args) + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e) + + if handler is None: + reraise(exc_type, exc_value, tb) + return handler(e) + + def handle_exception(self, e): + """Default exception handling that kicks in when an exception + occurs that is not caught. In debug mode the exception will + be re-raised immediately, otherwise it is logged and the handler + for a 500 internal server error is used. If no such handler + exists, a default 500 internal server error message is displayed. + + .. versionadded:: 0.3 + """ + exc_type, exc_value, tb = sys.exc_info() + + got_request_exception.send(self, exception=e) + handler = self._find_error_handler(InternalServerError()) + + if self.propagate_exceptions: + # if we want to repropagate the exception, we can attempt to + # raise it with the whole traceback in case we can do that + # (the function was actually called from the except part) + # otherwise, we just raise the error again + if exc_value is e: + reraise(exc_type, exc_value, tb) + else: + raise e + + self.log_exception((exc_type, exc_value, tb)) + if handler is None: + return InternalServerError() + return self.finalize_request(handler(e), from_error_handler=True) + + def log_exception(self, exc_info): + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error('Exception on %s [%s]' % ( + request.path, + request.method + ), exc_info=exc_info) + + def raise_routing_exception(self, request): + """Exceptions that are recording during routing are reraised with + this method. During debug we are not reraising redirect requests + for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising + a different error instead to help debug situations. + + :internal: + """ + if not self.debug \ + or not isinstance(request.routing_exception, RequestRedirect) \ + or request.method in ('GET', 'HEAD', 'OPTIONS'): + raise request.routing_exception + + from .debughelpers import FormDataRoutingRedirect + raise FormDataRoutingRedirect(request) + + def dispatch_request(self): + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = _request_ctx_stack.top.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule = req.url_rule + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if getattr(rule, 'provide_automatic_options', False) \ + and req.method == 'OPTIONS': + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + return self.view_functions[rule.endpoint](**req.view_args) + + def full_dispatch_request(self): + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self.try_trigger_before_first_request_functions() + try: + request_started.send(self) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request(self, rv, from_error_handler=False): + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send(self, response=response) + except Exception: + if not from_error_handler: + raise + self.logger.exception('Request finalizing failed with an ' + 'error while handling an error') + return response + + def try_trigger_before_first_request_functions(self): + """Called before each request and will ensure that it triggers + the :attr:`before_first_request_funcs` and only exactly once per + application instance (which means process usually). + + :internal: + """ + if self._got_first_request: + return + with self._before_request_lock: + if self._got_first_request: + return + for func in self.before_first_request_funcs: + func() + self._got_first_request = True + + def make_default_options_response(self): + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = _request_ctx_stack.top.url_adapter + if hasattr(adapter, 'allowed_methods'): + methods = adapter.allowed_methods() + else: + # fallback for Werkzeug < 0.7 + methods = [] + try: + adapter.match(method='--') + except MethodNotAllowed as e: + methods = e.valid_methods + except HTTPException as e: + pass + rv = self.response_class() + rv.allow.update(methods) + return rv + + def should_ignore_error(self, error): + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def make_response(self, rv): + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` (``unicode`` in Python 2) + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` (``str`` in Python 2) + A response object is created with the bytes as the body. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv + # other sized tuples are not allowed + else: + raise TypeError( + 'The view function did not return a valid response tuple.' + ' The tuple must have the form (body, status, headers),' + ' (body, status), or (body, headers).' + ) + + # the body must not be None + if rv is None: + raise TypeError( + 'The view function did not return a valid response. The' + ' function either returned None or ended without a return' + ' statement.' + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (text_type, bytes, bytearray)): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class(rv, status=status, headers=headers) + status = headers = None + else: + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type(rv, request.environ) + except TypeError as e: + new_error = TypeError( + '{e}\nThe view function did not return a valid' + ' response. The return type must be a string, tuple,' + ' Response instance, or WSGI callable, but it was a' + ' {rv.__class__.__name__}.'.format(e=e, rv=rv) + ) + reraise(TypeError, new_error, sys.exc_info()[2]) + + # prefer the status if it was provided + if status is not None: + if isinstance(status, (text_type, bytes, bytearray)): + rv.status = status + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.extend(headers) + + return rv + + def create_url_adapter(self, request): + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + subdomain = ((self.url_map.default_subdomain or None) + if not self.subdomain_matching else None) + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config['SERVER_NAME'], + subdomain=subdomain) + # We need at the very least the server name to be set for this + # to work. + if self.config['SERVER_NAME'] is not None: + return self.url_map.bind( + self.config['SERVER_NAME'], + script_name=self.config['APPLICATION_ROOT'], + url_scheme=self.config['PREFERRED_URL_SCHEME']) + + def inject_url_defaults(self, endpoint, values): + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + funcs = self.url_default_functions.get(None, ()) + if '.' in endpoint: + bp = endpoint.rsplit('.', 1)[0] + funcs = chain(funcs, self.url_default_functions.get(bp, ())) + for func in funcs: + func(endpoint, values) + + def handle_url_build_error(self, error, endpoint, values): + """Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`. + """ + exc_type, exc_value, tb = sys.exc_info() + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + if rv is not None: + return rv + except BuildError as e: + # make error available outside except block (py3) + error = e + + # At this point we want to reraise the exception. If the error is + # still the same one we can reraise it with the original traceback, + # otherwise we raise it from here. + if error is exc_value: + reraise(exc_type, exc_value, tb) + raise error + + def preprocess_request(self): + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + + bp = _request_ctx_stack.top.request.blueprint + + funcs = self.url_value_preprocessors.get(None, ()) + if bp is not None and bp in self.url_value_preprocessors: + funcs = chain(funcs, self.url_value_preprocessors[bp]) + for func in funcs: + func(request.endpoint, request.view_args) + + funcs = self.before_request_funcs.get(None, ()) + if bp is not None and bp in self.before_request_funcs: + funcs = chain(funcs, self.before_request_funcs[bp]) + for func in funcs: + rv = func() + if rv is not None: + return rv + + def process_response(self, response): + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = _request_ctx_stack.top + bp = ctx.request.blueprint + funcs = ctx._after_request_functions + if bp is not None and bp in self.after_request_funcs: + funcs = chain(funcs, reversed(self.after_request_funcs[bp])) + if None in self.after_request_funcs: + funcs = chain(funcs, reversed(self.after_request_funcs[None])) + for handler in funcs: + response = handler(response) + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + return response + + def do_teardown_request(self, exc=_sentinel): + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + funcs = reversed(self.teardown_request_funcs.get(None, ())) + bp = _request_ctx_stack.top.request.blueprint + if bp is not None and bp in self.teardown_request_funcs: + funcs = chain(funcs, reversed(self.teardown_request_funcs[bp])) + for func in funcs: + func(exc) + request_tearing_down.send(self, exc=exc) + + def do_teardown_appcontext(self, exc=_sentinel): + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + for func in reversed(self.teardown_appcontext_funcs): + func(exc) + appcontext_tearing_down.send(self, exc=exc) + + def app_context(self): + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ): + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args, **kwargs): + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from flask.testing import make_test_environ_builder + + builder = make_test_environ_builder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ, start_response): + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if self.should_ignore_error(error): + error = None + ctx.auto_pop(error) + + def __call__(self, environ, start_response): + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app` which can be + wrapped to applying middleware.""" + return self.wsgi_app(environ, start_response) + + def __repr__(self): + return '<%s %r>' % ( + self.__class__.__name__, + self.name, + ) diff --git a/venv/lib/python3.6/site-packages/flask/blueprints.py b/venv/lib/python3.6/site-packages/flask/blueprints.py new file mode 100644 index 0000000..5ce5561 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/blueprints.py @@ -0,0 +1,448 @@ +# -*- coding: utf-8 -*- +""" + flask.blueprints + ~~~~~~~~~~~~~~~~ + + Blueprints are the recommended way to implement larger or more + pluggable applications in Flask 0.7 and later. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" +from functools import update_wrapper +from werkzeug.urls import url_join + +from .helpers import _PackageBoundObject, _endpoint_from_view_func + + +class BlueprintSetupState(object): + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__(self, blueprint, app, options, first_registration): + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get('subdomain') + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get('url_prefix') + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get('url_defaults', ())) + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = '/'.join(( + self.url_prefix.rstrip('/'), rule.lstrip('/'))) + else: + rule = self.url_prefix + options.setdefault('subdomain', self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) + defaults = self.url_defaults + if 'defaults' in options: + defaults = dict(defaults, **options.pop('defaults')) + self.app.add_url_rule(rule, '%s.%s' % (self.blueprint.name, endpoint), + view_func, defaults=defaults, **options) + + +class Blueprint(_PackageBoundObject): + """Represents a blueprint. A blueprint is an object that records + functions that will be called with the + :class:`~flask.blueprints.BlueprintSetupState` later to register functions + or other things on the main application. See :ref:`blueprints` for more + information. + + .. versionadded:: 0.7 + """ + + warn_on_modifications = False + _got_registered_once = False + + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_encoder`. + json_encoder = None + #: Blueprint local JSON decoder class to use. + #: Set to ``None`` to use the app's :class:`~flask.app.Flask.json_decoder`. + json_decoder = None + + # TODO remove the next three attrs when Sphinx :inherited-members: works + # https://github.com/sphinx-doc/sphinx/issues/741 + + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, name, import_name, static_folder=None, + static_url_path=None, template_folder=None, + url_prefix=None, subdomain=None, url_defaults=None, + root_path=None): + _PackageBoundObject.__init__(self, import_name, template_folder, + root_path=root_path) + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.static_folder = static_folder + self.static_url_path = static_url_path + self.deferred_functions = [] + if url_defaults is None: + url_defaults = {} + self.url_values_defaults = url_defaults + + def record(self, func): + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + if self._got_registered_once and self.warn_on_modifications: + from warnings import warn + warn(Warning('The blueprint was already registered once ' + 'but is getting modified now. These changes ' + 'will not show up.')) + self.deferred_functions.append(func) + + def record_once(self, func): + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + def wrapper(state): + if state.first_registration: + func(state) + return self.record(update_wrapper(wrapper, func)) + + def make_setup_state(self, app, options, first_registration=False): + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + def register(self, app, options, first_registration=False): + """Called by :meth:`Flask.register_blueprint` to register all views + and callbacks registered on the blueprint with the application. Creates + a :class:`.BlueprintSetupState` and calls each :meth:`record` callback + with it. + + :param app: The application this blueprint is being registered with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + :param first_registration: Whether this is the first time this + blueprint has been registered on the application. + """ + self._got_registered_once = True + state = self.make_setup_state(app, options, first_registration) + + if self.has_static_folder: + state.add_url_rule( + self.static_url_path + '/', + view_func=self.send_static_file, endpoint='static' + ) + + for deferred in self.deferred_functions: + deferred(state) + + def route(self, rule, **options): + """Like :meth:`Flask.route` but for a blueprint. The endpoint for the + :func:`url_for` function is prefixed with the name of the blueprint. + """ + def decorator(f): + endpoint = options.pop("endpoint", f.__name__) + self.add_url_rule(rule, endpoint, f, **options) + return f + return decorator + + def add_url_rule(self, rule, endpoint=None, view_func=None, **options): + """Like :meth:`Flask.add_url_rule` but for a blueprint. The endpoint for + the :func:`url_for` function is prefixed with the name of the blueprint. + """ + if endpoint: + assert '.' not in endpoint, "Blueprint endpoints should not contain dots" + if view_func and hasattr(view_func, '__name__'): + assert '.' not in view_func.__name__, "Blueprint view function name should not contain dots" + self.record(lambda s: + s.add_url_rule(rule, endpoint, view_func, **options)) + + def endpoint(self, endpoint): + """Like :meth:`Flask.endpoint` but for a blueprint. This does not + prefix the endpoint with the blueprint name, this has to be done + explicitly by the user of this method. If the endpoint is prefixed + with a `.` it will be registered to the current blueprint, otherwise + it's an application independent endpoint. + """ + def decorator(f): + def register_endpoint(state): + state.app.view_functions[endpoint] = f + self.record_once(register_endpoint) + return f + return decorator + + def app_template_filter(self, name=None): + """Register a custom template filter, available application wide. Like + :meth:`Flask.template_filter` but for a blueprint. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + def decorator(f): + self.add_app_template_filter(f, name=name) + return f + return decorator + + def add_app_template_filter(self, f, name=None): + """Register a custom template filter, available application wide. Like + :meth:`Flask.add_template_filter` but for a blueprint. Works exactly + like the :meth:`app_template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + def register_template(state): + state.app.jinja_env.filters[name or f.__name__] = f + self.record_once(register_template) + + def app_template_test(self, name=None): + """Register a custom template test, available application wide. Like + :meth:`Flask.template_test` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + def decorator(f): + self.add_app_template_test(f, name=name) + return f + return decorator + + def add_app_template_test(self, f, name=None): + """Register a custom template test, available application wide. Like + :meth:`Flask.add_template_test` but for a blueprint. Works exactly + like the :meth:`app_template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + def register_template(state): + state.app.jinja_env.tests[name or f.__name__] = f + self.record_once(register_template) + + def app_template_global(self, name=None): + """Register a custom template global, available application wide. Like + :meth:`Flask.template_global` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + def decorator(f): + self.add_app_template_global(f, name=name) + return f + return decorator + + def add_app_template_global(self, f, name=None): + """Register a custom template global, available application wide. Like + :meth:`Flask.add_template_global` but for a blueprint. Works exactly + like the :meth:`app_template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + def register_template(state): + state.app.jinja_env.globals[name or f.__name__] = f + self.record_once(register_template) + + def before_request(self, f): + """Like :meth:`Flask.before_request` but for a blueprint. This function + is only executed before each request that is handled by a function of + that blueprint. + """ + self.record_once(lambda s: s.app.before_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def before_app_request(self, f): + """Like :meth:`Flask.before_request`. Such a function is executed + before each request, even if outside of a blueprint. + """ + self.record_once(lambda s: s.app.before_request_funcs + .setdefault(None, []).append(f)) + return f + + def before_app_first_request(self, f): + """Like :meth:`Flask.before_first_request`. Such a function is + executed before the first request to the application. + """ + self.record_once(lambda s: s.app.before_first_request_funcs.append(f)) + return f + + def after_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. This function + is only executed after each request that is handled by a function of + that blueprint. + """ + self.record_once(lambda s: s.app.after_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def after_app_request(self, f): + """Like :meth:`Flask.after_request` but for a blueprint. Such a function + is executed after each request, even if outside of the blueprint. + """ + self.record_once(lambda s: s.app.after_request_funcs + .setdefault(None, []).append(f)) + return f + + def teardown_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. This + function is only executed when tearing down requests handled by a + function of that blueprint. Teardown request functions are executed + when the request context is popped, even when no actual request was + performed. + """ + self.record_once(lambda s: s.app.teardown_request_funcs + .setdefault(self.name, []).append(f)) + return f + + def teardown_app_request(self, f): + """Like :meth:`Flask.teardown_request` but for a blueprint. Such a + function is executed when tearing down each request, even if outside of + the blueprint. + """ + self.record_once(lambda s: s.app.teardown_request_funcs + .setdefault(None, []).append(f)) + return f + + def context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. This + function is only executed for requests handled by a blueprint. + """ + self.record_once(lambda s: s.app.template_context_processors + .setdefault(self.name, []).append(f)) + return f + + def app_context_processor(self, f): + """Like :meth:`Flask.context_processor` but for a blueprint. Such a + function is executed each request, even if outside of the blueprint. + """ + self.record_once(lambda s: s.app.template_context_processors + .setdefault(None, []).append(f)) + return f + + def app_errorhandler(self, code): + """Like :meth:`Flask.errorhandler` but for a blueprint. This + handler is used for all requests, even if outside of the blueprint. + """ + def decorator(f): + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + return decorator + + def url_value_preprocessor(self, f): + """Registers a function as URL value preprocessor for this + blueprint. It's called before the view functions are called and + can modify the url values provided. + """ + self.record_once(lambda s: s.app.url_value_preprocessors + .setdefault(self.name, []).append(f)) + return f + + def url_defaults(self, f): + """Callback function for URL defaults for this blueprint. It's called + with the endpoint and values and should update the values passed + in place. + """ + self.record_once(lambda s: s.app.url_default_functions + .setdefault(self.name, []).append(f)) + return f + + def app_url_value_preprocessor(self, f): + """Same as :meth:`url_value_preprocessor` but application wide. + """ + self.record_once(lambda s: s.app.url_value_preprocessors + .setdefault(None, []).append(f)) + return f + + def app_url_defaults(self, f): + """Same as :meth:`url_defaults` but application wide. + """ + self.record_once(lambda s: s.app.url_default_functions + .setdefault(None, []).append(f)) + return f + + def errorhandler(self, code_or_exception): + """Registers an error handler that becomes active for this blueprint + only. Please be aware that routing does not happen local to a + blueprint so an error handler for 404 usually is not handled by + a blueprint unless it is caused inside a view function. Another + special case is the 500 internal server error which is always looked + up from the application. + + Otherwise works as the :meth:`~flask.Flask.errorhandler` decorator + of the :class:`~flask.Flask` object. + """ + def decorator(f): + self.record_once(lambda s: s.app._register_error_handler( + self.name, code_or_exception, f)) + return f + return decorator + + def register_error_handler(self, code_or_exception, f): + """Non-decorator version of the :meth:`errorhandler` error attach + function, akin to the :meth:`~flask.Flask.register_error_handler` + application-wide function of the :class:`~flask.Flask` object but + for error handlers limited to this blueprint. + + .. versionadded:: 0.11 + """ + self.record_once(lambda s: s.app._register_error_handler( + self.name, code_or_exception, f)) diff --git a/venv/lib/python3.6/site-packages/flask/cli.py b/venv/lib/python3.6/site-packages/flask/cli.py new file mode 100644 index 0000000..efc1733 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/cli.py @@ -0,0 +1,898 @@ +# -*- coding: utf-8 -*- +""" + flask.cli + ~~~~~~~~~ + + A simple command line application to run flask apps. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import print_function + +import ast +import inspect +import os +import re +import ssl +import sys +import traceback +from functools import update_wrapper +from operator import attrgetter +from threading import Lock, Thread + +import click +from werkzeug.utils import import_string + +from . import __version__ +from ._compat import getargspec, iteritems, reraise, text_type +from .globals import current_app +from .helpers import get_debug_flag, get_env, get_load_dotenv + +try: + import dotenv +except ImportError: + dotenv = None + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(script_info, module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ('app', 'application'): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [ + v for k, v in iteritems(module.__dict__) if isinstance(v, Flask) + ] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + 'Detected multiple Flask applications in module "{module}". Use ' + '"FLASK_APP={module}:name" to specify the correct ' + 'one.'.format(module=module.__name__) + ) + + # Search for app factory functions. + for attr_name in ('create_app', 'make_app'): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = call_factory(script_info, app_factory) + + if isinstance(app, Flask): + return app + except TypeError: + if not _called_with_wrong_args(app_factory): + raise + raise NoAppException( + 'Detected factory "{factory}" in module "{module}", but ' + 'could not call it without arguments. Use ' + '"FLASK_APP=\'{module}:{factory}(args)\'" to specify ' + 'arguments.'.format( + factory=attr_name, module=module.__name__ + ) + ) + + raise NoAppException( + 'Failed to find Flask application or factory in module "{module}". ' + 'Use "FLASK_APP={module}:name to specify one.'.format( + module=module.__name__ + ) + ) + + +def call_factory(script_info, app_factory, arguments=()): + """Takes an app factory, a ``script_info` object and optionally a tuple + of arguments. Checks for the existence of a script_info argument and calls + the app_factory depending on that and the arguments provided. + """ + args_spec = getargspec(app_factory) + arg_names = args_spec.args + arg_defaults = args_spec.defaults + + if 'script_info' in arg_names: + return app_factory(*arguments, script_info=script_info) + elif arguments: + return app_factory(*arguments) + elif not arguments and len(arg_names) == 1 and arg_defaults is None: + return app_factory(script_info) + + return app_factory() + + +def _called_with_wrong_args(factory): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param factory: the factory function that was called + :return: true if the call failed + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is factory.__code__: + # in the factory, it was called successfully + return False + + tb = tb.tb_next + + # didn't reach the factory + return True + finally: + del tb + + +def find_app_by_string(script_info, module, app_name): + """Checks if the given string is a variable name or a function. If it is a + function, it checks for specified arguments and whether it takes a + ``script_info`` argument and calls the function with the appropriate + arguments. + """ + from flask import Flask + match = re.match(r'^ *([^ ()]+) *(?:\((.*?) *,? *\))? *$', app_name) + + if not match: + raise NoAppException( + '"{name}" is not a valid variable name or function ' + 'expression.'.format(name=app_name) + ) + + name, args = match.groups() + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException(e.args[0]) + + if inspect.isfunction(attr): + if args: + try: + args = ast.literal_eval('({args},)'.format(args=args)) + except (ValueError, SyntaxError)as e: + raise NoAppException( + 'Could not parse the arguments in ' + '"{app_name}".'.format(e=e, app_name=app_name) + ) + else: + args = () + + try: + app = call_factory(script_info, attr, args) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + '{e}\nThe factory "{app_name}" in module "{module}" could not ' + 'be called with the specified arguments.'.format( + e=e, app_name=app_name, module=module.__name__ + ) + ) + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + 'A valid Flask application was not obtained from ' + '"{module}:{app_name}".'.format( + module=module.__name__, app_name=app_name + ) + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + if os.path.splitext(path)[1] == '.py': + path = os.path.splitext(path)[0] + + if os.path.basename(path) == '__init__': + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, '__init__.py')): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return '.'.join(module_name[::-1]) + + +def locate_app(script_info, module_name, app_name, raise_if_not_found=True): + __traceback_hide__ = True + + try: + __import__(module_name) + except ImportError: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[-1].tb_next: + raise NoAppException( + 'While importing "{name}", an ImportError was raised:' + '\n\n{tb}'.format(name=module_name, tb=traceback.format_exc()) + ) + elif raise_if_not_found: + raise NoAppException( + 'Could not import "{name}".'.format(name=module_name) + ) + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(script_info, module) + else: + return find_app_by_string(script_info, module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + message = 'Flask %(version)s\nPython %(python_version)s' + click.echo(message % { + 'version': __version__, + 'python_version': sys.version, + }, color=ctx.color) + ctx.exit() + + +version_option = click.Option( + ['--version'], + help='Show the flask version', + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True +) + + +class DispatchingApp(object): + """Special application that dispatches to a Flask application which + is imported by name in a background thread. If an error happens + it is recorded and shown as part of the WSGI handling which in case + of the Werkzeug debugger means that it shows up in the browser. + """ + + def __init__(self, loader, use_eager_loading=False): + self.loader = loader + self._app = None + self._lock = Lock() + self._bg_loading_exc_info = None + if use_eager_loading: + self._load_unlocked() + else: + self._load_in_background() + + def _load_in_background(self): + def _load_app(): + __traceback_hide__ = True + with self._lock: + try: + self._load_unlocked() + except Exception: + self._bg_loading_exc_info = sys.exc_info() + t = Thread(target=_load_app, args=()) + t.start() + + def _flush_bg_loading_exception(self): + __traceback_hide__ = True + exc_info = self._bg_loading_exc_info + if exc_info is not None: + self._bg_loading_exc_info = None + reraise(*exc_info) + + def _load_unlocked(self): + __traceback_hide__ = True + self._app = rv = self.loader() + self._bg_loading_exc_info = None + return rv + + def __call__(self, environ, start_response): + __traceback_hide__ = True + if self._app is not None: + return self._app(environ, start_response) + self._flush_bg_loading_exception() + with self._lock: + if self._app is not None: + rv = self._app + else: + rv = self._load_unlocked() + return rv(environ, start_response) + + +class ScriptInfo(object): + """Help object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__(self, app_import_path=None, create_app=None): + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path or os.environ.get('FLASK_APP') + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data = {} + self._loaded_app = None + + def load_app(self): + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + __traceback_hide__ = True + + if self._loaded_app is not None: + return self._loaded_app + + app = None + + if self.create_app is not None: + app = call_factory(self, self.create_app) + else: + if self.app_import_path: + path, name = (self.app_import_path.split(':', 1) + [None])[:2] + import_name = prepare_import(path) + app = locate_app(self, import_name, name) + else: + for path in ('wsgi.py', 'app.py'): + import_name = prepare_import(path) + app = locate_app(self, import_name, None, + raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + 'Could not locate a Flask application. You did not provide ' + 'the "FLASK_APP" environment variable, and a "wsgi.py" or ' + '"app.py" module was not found in the current directory.' + ) + + debug = get_debug_flag() + + # Update the app's debug flag through the descriptor so that other + # values repopulate as well. + if debug is not None: + app.debug = debug + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. If callbacks are registered directly + to the ``app.cli`` object then they are wrapped with this function + by default unless it's disabled. + """ + @click.pass_context + def decorator(__ctx, *args, **kwargs): + with __ctx.ensure_object(ScriptInfo).load_app().app_context(): + return __ctx.invoke(f, *args, **kwargs) + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop('with_appcontext', True) + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault('cls', AppGroup) + return click.Group.group(self, *args, **kwargs) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. + + For information as of why this is useful see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands wil be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__(self, add_default_commands=True, create_app=None, + add_version_option=True, load_dotenv=True, **extra): + params = list(extra.pop('params', None) or ()) + + if add_version_option: + params.append(version_option) + + AppGroup.__init__(self, params=params, **extra) + self.create_app = create_app + self.load_dotenv = load_dotenv + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + try: + import pkg_resources + except ImportError: + self._loaded_plugin_commands = True + return + + for ep in pkg_resources.iter_entry_points('flask.commands'): + self.add_command(ep.load(), ep.name) + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + + # We load built-in commands first as these should always be the + # same no matter what the app does. If the app does want to + # override this it needs to make a custom instance of this group + # and not attach the default commands. + # + # This also means that the script stays functional in case the + # application completely fails. + rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + try: + rv = info.load_app().cli.get_command(ctx, name) + if rv is not None: + return rv + except NoAppException: + pass + + def list_commands(self, ctx): + self._load_plugin_commands() + + # The commands available is the list of both the application (if + # available) plus the builtin commands. + rv = set(click.Group.list_commands(self, ctx)) + info = ctx.ensure_object(ScriptInfo) + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except Exception: + # Here we intentionally swallow all exceptions as we don't + # want the help page to break if the app does not exist. + # If someone attempts to use the command we try to create + # the app again and this will give us the error. + # However, we will not do so silently because that would confuse + # users. + traceback.print_exc() + return sorted(rv) + + def main(self, *args, **kwargs): + # Set a global flag that indicates that we were invoked from the + # command line interface. This is detected by Flask.run to make the + # call into a no-op. This is necessary to avoid ugly errors when the + # script that is loaded here also attempts to start a server. + os.environ['FLASK_RUN_FROM_CLI'] = 'true' + + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + obj = kwargs.get('obj') + + if obj is None: + obj = ScriptInfo(create_app=self.create_app) + + kwargs['obj'] = obj + kwargs.setdefault('auto_envvar_prefix', 'FLASK') + return super(FlaskGroup, self).main(*args, **kwargs) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path):].lstrip(os.sep)) == other + + +def load_dotenv(path=None): + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + Changes the current working directory to the location of the first file + found, with the assumption that it is in the top level project directory + and will be where the Python path should import local packages from. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionadded:: 1.0 + """ + if dotenv is None: + if path or os.path.exists('.env') or os.path.exists('.flaskenv'): + click.secho( + ' * Tip: There are .env files present.' + ' Do "pip install python-dotenv" to use them.', + fg='yellow') + return + + if path is not None: + return dotenv.load_dotenv(path) + + new_dir = None + + for name in ('.env', '.flaskenv'): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + if new_dir is None: + new_dir = os.path.dirname(path) + + dotenv.load_dotenv(path) + + if new_dir and os.getcwd() != new_dir: + os.chdir(new_dir) + + return new_dir is not None # at least one file was located and loaded + + +def show_server_banner(env, debug, app_import_path, eager_loading): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': + return + + if app_import_path is not None: + message = ' * Serving Flask app "{0}"'.format(app_import_path) + + if not eager_loading: + message += ' (lazy loading)' + + click.echo(message) + + click.echo(' * Environment: {0}'.format(env)) + + if env == 'production': + click.secho( + ' WARNING: Do not use the development server in a production' + ' environment.', fg='red') + click.secho(' Use a production WSGI server instead.', dim=True) + + if debug is not None: + click.echo(' * Debug mode: {0}'.format('on' if debug else 'off')) + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = 'path' + + def __init__(self): + self.path_type = click.Path( + exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == 'adhoc': + try: + import OpenSSL + except ImportError: + raise click.BadParameter( + 'Using ad-hoc certificates requires pyOpenSSL.', + ctx, param) + + return value + + obj = import_string(value, silent=True) + + if sys.version_info < (2, 7): + if obj: + return obj + else: + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get('cert') + is_adhoc = cert == 'adhoc' + + if sys.version_info < (2, 7): + is_context = cert and not isinstance(cert, (text_type, bytes)) + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', + ctx, param) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', + ctx, param) + + if not cert: + raise click.BadParameter( + '"--cert" must also be specified.', + ctx, param) + + ctx.params['cert'] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter( + 'Required when using "--cert".', + ctx, param) + + return value + + +@click.command('run', short_help='Runs a development server.') +@click.option('--host', '-h', default='127.0.0.1', + help='The interface to bind to.') +@click.option('--port', '-p', default=5000, + help='The port to bind to.') +@click.option('--cert', type=CertParamType(), + help='Specify a certificate file to use HTTPS.') +@click.option('--key', + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, expose_value=False, + help='The key file to use when specifying a certificate.') +@click.option('--reload/--no-reload', default=None, + help='Enable or disable the reloader. By default the reloader ' + 'is active if debug is enabled.') +@click.option('--debugger/--no-debugger', default=None, + help='Enable or disable the debugger. By default the debugger ' + 'is active if debug is enabled.') +@click.option('--eager-loading/--lazy-loader', default=None, + help='Enable or disable eager loading. By default eager ' + 'loading is enabled if the reloader is disabled.') +@click.option('--with-threads/--without-threads', default=True, + help='Enable or disable multithreading.') +@pass_script_info +def run_command(info, host, port, reload, debugger, eager_loading, + with_threads, cert): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default if + FLASK_ENV=development or FLASK_DEBUG=1. + """ + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + if eager_loading is None: + eager_loading = not reload + + show_server_banner(get_env(), debug, info.app_import_path, eager_loading) + app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) + + from werkzeug.serving import run_simple + run_simple(host, port, app, use_reloader=reload, use_debugger=debugger, + threaded=with_threads, ssl_context=cert) + + +@click.command('shell', short_help='Runs a shell in the app context.') +@with_appcontext +def shell_command(): + """Runs an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to it's configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + from flask.globals import _app_ctx_stack + app = _app_ctx_stack.top.app + banner = 'Python %s on %s\nApp: %s [%s]\nInstance: %s' % ( + sys.version, + sys.platform, + app.import_name, + app.env, + app.instance_path, + ) + ctx = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get('PYTHONSTARTUP') + if startup and os.path.isfile(startup): + with open(startup, 'r') as f: + eval(compile(f.read(), startup, 'exec'), ctx) + + ctx.update(app.make_shell_context()) + + code.interact(banner=banner, local=ctx) + + +@click.command('routes', short_help='Show the routes for the app.') +@click.option( + '--sort', '-s', + type=click.Choice(('endpoint', 'methods', 'rule', 'match')), + default='endpoint', + help=( + 'Method to sort routes by. "match" is the order that Flask will match ' + 'routes when dispatching a request.' + ) +) +@click.option( + '--all-methods', + is_flag=True, + help="Show HEAD and OPTIONS methods." +) +@with_appcontext +def routes_command(sort, all_methods): + """Show all registered routes with endpoints and methods.""" + + rules = list(current_app.url_map.iter_rules()) + if not rules: + click.echo('No routes were registered.') + return + + ignored_methods = set(() if all_methods else ('HEAD', 'OPTIONS')) + + if sort in ('endpoint', 'rule'): + rules = sorted(rules, key=attrgetter(sort)) + elif sort == 'methods': + rules = sorted(rules, key=lambda rule: sorted(rule.methods)) + + rule_methods = [ + ', '.join(sorted(rule.methods - ignored_methods)) for rule in rules + ] + + headers = ('Endpoint', 'Methods', 'Rule') + widths = ( + max(len(rule.endpoint) for rule in rules), + max(len(methods) for methods in rule_methods), + max(len(rule.rule) for rule in rules), + ) + widths = [max(len(h), w) for h, w in zip(headers, widths)] + row = '{{0:<{0}}} {{1:<{1}}} {{2:<{2}}}'.format(*widths) + + click.echo(row.format(*headers).strip()) + click.echo(row.format(*('-' * width for width in widths))) + + for rule, methods in zip(rules, rule_methods): + click.echo(row.format(rule.endpoint, methods, rule.rule).rstrip()) + + +cli = FlaskGroup(help="""\ +A general utility script for Flask applications. + +Provides commands from Flask, extensions, and the application. Loads the +application defined in the FLASK_APP environment variable, or from a wsgi.py +file. Setting the FLASK_ENV environment variable to 'development' will enable +debug mode. + +\b + {prefix}{cmd} FLASK_APP=hello.py + {prefix}{cmd} FLASK_ENV=development + {prefix}flask run +""".format( + cmd='export' if os.name == 'posix' else 'set', + prefix='$ ' if os.name == 'posix' else '> ' +)) + + +def main(as_module=False): + args = sys.argv[1:] + + if as_module: + this_module = 'flask' + + if sys.version_info < (2, 7): + this_module += '.cli' + + name = 'python -m ' + this_module + + # Python rewrites "python -m flask" to the path to the file in argv. + # Restore the original command so that the reloader works. + sys.argv = ['-m', this_module] + args + else: + name = None + + cli.main(args=args, prog_name=name) + + +if __name__ == '__main__': + main(as_module=True) diff --git a/venv/lib/python3.6/site-packages/flask/config.py b/venv/lib/python3.6/site-packages/flask/config.py new file mode 100644 index 0000000..d6074ba --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/config.py @@ -0,0 +1,265 @@ +# -*- coding: utf-8 -*- +""" + flask.config + ~~~~~~~~~~~~ + + Implements the configuration related objects. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import types +import errno + +from werkzeug.utils import import_string +from ._compat import string_types, iteritems +from . import json + + +class ConfigAttribute(object): + """Makes an attribute forward to the config""" + + def __init__(self, name, get_converter=None): + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj, type=None): + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj, value): + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__(self, root_path, defaults=None): + dict.__init__(self, defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name, silent=False): + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: bool. ``True`` if able to load config, ``False`` otherwise. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError('The environment variable %r is not set ' + 'and as such configuration could not be ' + 'loaded. Set this variable and make it ' + 'point to a configuration file' % + variable_name) + return self.from_pyfile(rv, silent=silent) + + def from_pyfile(self, filename, silent=False): + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType('config') + d.__file__ = filename + try: + with open(filename, mode='rb') as config_file: + exec(compile(config_file.read(), filename, 'exec'), d.__dict__) + except IOError as e: + if silent and e.errno in ( + errno.ENOENT, errno.EISDIR, errno.ENOTDIR + ): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + self.from_object(d) + return True + + def from_object(self, obj): + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, string_types): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_json(self, filename, silent=False): + """Updates the values in the config from a JSON file. This function + behaves as if the JSON object was a dictionary and passed to the + :meth:`from_mapping` function. + + :param filename: the filename of the JSON file. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.11 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename) as json_file: + obj = json.loads(json_file.read()) + except IOError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + return self.from_mapping(obj) + + def from_mapping(self, *mapping, **kwargs): + """Updates the config like :meth:`update` ignoring items with non-upper + keys. + + .. versionadded:: 0.11 + """ + mappings = [] + if len(mapping) == 1: + if hasattr(mapping[0], 'items'): + mappings.append(mapping[0].items()) + else: + mappings.append(mapping[0]) + elif len(mapping) > 1: + raise TypeError( + 'expected at most 1 positional argument, got %d' % len(mapping) + ) + mappings.append(kwargs.items()) + for mapping in mappings: + for (key, value) in mapping: + if key.isupper(): + self[key] = value + return True + + def get_namespace(self, namespace, lowercase=True, trim_namespace=True): + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in iteritems(self): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace):] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self)) diff --git a/venv/lib/python3.6/site-packages/flask/ctx.py b/venv/lib/python3.6/site-packages/flask/ctx.py new file mode 100644 index 0000000..8472c92 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/ctx.py @@ -0,0 +1,457 @@ +# -*- coding: utf-8 -*- +""" + flask.ctx + ~~~~~~~~~ + + Implements the objects required to keep the context. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import sys +from functools import update_wrapper + +from werkzeug.exceptions import HTTPException + +from .globals import _request_ctx_stack, _app_ctx_stack +from .signals import appcontext_pushed, appcontext_popped +from ._compat import BROKEN_PYPY_CTXMGR_EXIT, reraise + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals(object): + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + def get(self, name, default=None): + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name, default=_sentinel): + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raise a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name, default=None): + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param: default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item): + return item in self.__dict__ + + def __iter__(self): + return iter(self.__dict__) + + def __repr__(self): + top = _app_ctx_stack.top + if top is not None: + return '' % top.app.name + return object.__repr__(self) + + +def after_this_request(f): + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + _request_ctx_stack.top._after_request_functions.append(f) + return f + + +def copy_current_request_context(f): + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request like you + # would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + top = _request_ctx_stack.top + if top is None: + raise RuntimeError('This decorator can only be used at local scopes ' + 'when a request context is on the stack. For instance within ' + 'view functions.') + reqctx = top.copy() + def wrapper(*args, **kwargs): + with reqctx: + return f(*args, **kwargs) + return update_wrapper(wrapper, f) + + +def has_request_context(): + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g` for truthness):: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _request_ctx_stack.top is not None + + +def has_app_context(): + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _app_ctx_stack.top is not None + + +class AppContext(object): + """The application context binds an application object implicitly + to the current thread or greenlet, similar to how the + :class:`RequestContext` binds request information. The application + context is also implicitly created if a request context is created + but the application is not on top of the individual application + context. + """ + + def __init__(self, app): + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g = app.app_ctx_globals_class() + + # Like request context, app contexts can be pushed multiple times + # but there a basic "refcount" is enough to track them. + self._refcnt = 0 + + def push(self): + """Binds the app context to the current context.""" + self._refcnt += 1 + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + _app_ctx_stack.push(self) + appcontext_pushed.send(self.app) + + def pop(self, exc=_sentinel): + """Pops the app context.""" + try: + self._refcnt -= 1 + if self._refcnt <= 0: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + rv = _app_ctx_stack.pop() + assert rv is self, 'Popped wrong app context. (%r instead of %r)' \ + % (rv, self) + appcontext_popped.send(self.app) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + +class RequestContext(object): + """The request context contains all request relevant information. It is + created at the beginning of the request and pushed to the + `_request_ctx_stack` and removed at the end of it. It will create the + URL adapter and request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the request + for you. In debug mode the request context is kept around if + exceptions happen so that interactive debuggers have a chance to + introspect the data. With 0.4 this can also be forced for requests + that did not fail and outside of ``DEBUG`` mode. By setting + ``'flask._preserve_context'`` to ``True`` on the WSGI environment the + context will not pop itself at the end of the request. This is used by + the :meth:`~flask.Flask.test_client` for example to implement the + deferred cleanup functionality. + + You might find this helpful for unittests where you need the + information from the context local around for a little longer. Make + sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in + that situation, otherwise your unittests will leak memory. + """ + + def __init__(self, app, environ, request=None): + self.app = app + if request is None: + request = app.request_class(environ) + self.request = request + self.url_adapter = app.create_url_adapter(self.request) + self.flashes = None + self.session = None + + # Request contexts can be pushed multiple times and interleaved with + # other request contexts. Now only if the last level is popped we + # get rid of them. Additionally if an application context is missing + # one is created implicitly so for each level we add this information + self._implicit_app_ctx_stack = [] + + # indicator if the context was preserved. Next time another context + # is pushed the preserved context is popped. + self.preserved = False + + # remembers the exception for pop if there is one in case the context + # preservation kicks in. + self._preserved_exc = None + + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions = [] + + self.match_request() + + def _get_g(self): + return _app_ctx_stack.top.g + def _set_g(self, value): + _app_ctx_stack.top.g = value + g = property(_get_g, _set_g) + del _get_g, _set_g + + def copy(self): + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + """ + return self.__class__(self.app, + environ=self.request.environ, + request=self.request + ) + + def match_request(self): + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + url_rule, self.request.view_args = \ + self.url_adapter.match(return_rule=True) + self.request.url_rule = url_rule + except HTTPException as e: + self.request.routing_exception = e + + def push(self): + """Binds the request context to the current context.""" + # If an exception occurs in debug mode or if context preservation is + # activated under exception situations exactly one context stays + # on the stack. The rationale is that you want to access that + # information under debug situations. However if someone forgets to + # pop that context again we want to make sure that on the next push + # it's invalidated, otherwise we run at risk that something leaks + # memory. This is usually only a problem in test suite since this + # functionality is not active in production environments. + top = _request_ctx_stack.top + if top is not None and top.preserved: + top.pop(top._preserved_exc) + + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _app_ctx_stack.top + if app_ctx is None or app_ctx.app != self.app: + app_ctx = self.app.app_context() + app_ctx.push() + self._implicit_app_ctx_stack.append(app_ctx) + else: + self._implicit_app_ctx_stack.append(None) + + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + _request_ctx_stack.push(self) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session( + self.app, self.request + ) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + def pop(self, exc=_sentinel): + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + app_ctx = self._implicit_app_ctx_stack.pop() + + try: + clear_request = False + if not self._implicit_app_ctx_stack: + self.preserved = False + self._preserved_exc = None + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + # If this interpreter supports clearing the exception information + # we do that now. This will only go into effect on Python 2.x, + # on 3.x it disappears automatically at the end of the exception + # stack. + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + request_close = getattr(self.request, 'close', None) + if request_close is not None: + request_close() + clear_request = True + finally: + rv = _request_ctx_stack.pop() + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + rv.request.environ['werkzeug.request'] = None + + # Get rid of the app as well if necessary. + if app_ctx is not None: + app_ctx.pop(exc) + + assert rv is self, 'Popped wrong request context. ' \ + '(%r instead of %r)' % (rv, self) + + def auto_pop(self, exc): + if self.request.environ.get('flask._preserve_context') or \ + (exc is not None and self.app.preserve_context_on_exception): + self.preserved = True + self._preserved_exc = exc + else: + self.pop(exc) + + def __enter__(self): + self.push() + return self + + def __exit__(self, exc_type, exc_value, tb): + # do not pop the request stack if we are in debug mode and an + # exception happened. This will allow the debugger to still + # access the request object in the interactive shell. Furthermore + # the context can be force kept alive for the test client. + # See flask.testing for how this works. + self.auto_pop(exc_value) + + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + + def __repr__(self): + return '<%s \'%s\' [%s] of %s>' % ( + self.__class__.__name__, + self.request.url, + self.request.method, + self.app.name, + ) diff --git a/venv/lib/python3.6/site-packages/flask/debughelpers.py b/venv/lib/python3.6/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..e9765f2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/debughelpers.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +""" + flask.debughelpers + ~~~~~~~~~~~~~~~~~~ + + Various helpers to make the development experience better. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +from warnings import warn + +from ._compat import implements_to_string, text_type +from .app import Flask +from .blueprints import Blueprint +from .globals import _request_ctx_stack + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +@implements_to_string +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = ['You tried to access the file "%s" in the request.files ' + 'dictionary but it does not exist. The mimetype for the request ' + 'is "%s" instead of "multipart/form-data" which means that no ' + 'file contents were transmitted. To fix this error you should ' + 'provide enctype="multipart/form-data" in your form.' % + (key, request.mimetype)] + if form_matches: + buf.append('\n\nThe browser instead transmitted some file names. ' + 'This was submitted: %s' % ', '.join('"%s"' % x + for x in form_matches)) + self.msg = ''.join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised by Flask in debug mode if it detects a + redirect caused by the routing system when the request method is not + GET, HEAD or OPTIONS. Reasoning: form data will be dropped. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = ['A request was sent to this URL (%s) but a redirect was ' + 'issued automatically by the routing system to "%s".' + % (request.url, exc.new_url)] + + # In case just a slash was appended we can be extra helpful + if request.base_url + '/' == exc.new_url.split('?')[0]: + buf.append(' The URL was defined with a trailing slash so ' + 'Flask will automatically redirect to the URL ' + 'with the trailing slash if it was accessed ' + 'without one.') + + buf.append(' Make sure to directly send your %s-request to this URL ' + 'since we can\'t make browsers or HTTP clients redirect ' + 'with form data reliably or without user interaction.' % + request.method) + buf.append('\n\nNote: this exception is only raised in debug mode') + AssertionError.__init__(self, ''.join(buf).encode('utf-8')) + + +def attach_enctype_error_multidict(request): + """Since Flask 0.8 we're monkeypatching the files object in case a + request is detected that does not use multipart form data but the files + object is accessed. + """ + oldcls = request.files.__class__ + class newcls(oldcls): + def __getitem__(self, key): + try: + return oldcls.__getitem__(self, key) + except KeyError: + if key not in request.form: + raise + raise DebugFilesKeyError(request, key) + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader): + yield 'class: %s.%s' % (type(loader).__module__, type(loader).__name__) + for key, value in sorted(loader.__dict__.items()): + if key.startswith('_'): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, (str, text_type)) for x in value): + continue + yield '%s:' % key + for item in value: + yield ' - %s' % item + continue + elif not isinstance(value, (str, text_type, int, float, bool)): + continue + yield '%s: %r' % (key, value) + + +def explain_template_loading_attempts(app, template, attempts): + """This should help developers understand what failed""" + info = ['Locating template "%s":' % template] + total_found = 0 + blueprint = None + reqctx = _request_ctx_stack.top + if reqctx is not None and reqctx.request.blueprint is not None: + blueprint = reqctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, Flask): + src_info = 'application "%s"' % srcobj.import_name + elif isinstance(srcobj, Blueprint): + src_info = 'blueprint "%s" (%s)' % (srcobj.name, + srcobj.import_name) + else: + src_info = repr(srcobj) + + info.append('% 5d: trying loader of %s' % ( + idx + 1, src_info)) + + for line in _dump_loader_info(loader): + info.append(' %s' % line) + + if triple is None: + detail = 'no match' + else: + detail = 'found (%r)' % (triple[1] or '') + total_found += 1 + info.append(' -> %s' % detail) + + seems_fishy = False + if total_found == 0: + info.append('Error: the template could not be found.') + seems_fishy = True + elif total_found > 1: + info.append('Warning: multiple loaders returned a match for the template.') + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append(' The template was looked up from an endpoint that ' + 'belongs to the blueprint "%s".' % blueprint) + info.append(' Maybe you did not place a template in the right folder?') + info.append(' See http://flask.pocoo.org/docs/blueprints/#templates') + + app.logger.info('\n'.join(info)) + + +def explain_ignored_app_run(): + if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': + warn(Warning('Silently ignoring app.run() because the ' + 'application is run from the flask command line ' + 'executable. Consider putting app.run() behind an ' + 'if __name__ == "__main__" guard to silence this ' + 'warning.'), stacklevel=3) diff --git a/venv/lib/python3.6/site-packages/flask/globals.py b/venv/lib/python3.6/site-packages/flask/globals.py new file mode 100644 index 0000000..7d50a6f --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/globals.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +""" + flask.globals + ~~~~~~~~~~~~~ + + Defines all the global objects that are proxies to the current + active context. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +from functools import partial +from werkzeug.local import LocalStack, LocalProxy + + +_request_ctx_err_msg = '''\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +''' +_app_ctx_err_msg = '''\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +to interface with the current application object in some way. To solve +this, set up an application context with app.app_context(). See the +documentation for more information.\ +''' + + +def _lookup_req_object(name): + top = _request_ctx_stack.top + if top is None: + raise RuntimeError(_request_ctx_err_msg) + return getattr(top, name) + + +def _lookup_app_object(name): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return getattr(top, name) + + +def _find_app(): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return top.app + + +# context locals +_request_ctx_stack = LocalStack() +_app_ctx_stack = LocalStack() +current_app = LocalProxy(_find_app) +request = LocalProxy(partial(_lookup_req_object, 'request')) +session = LocalProxy(partial(_lookup_req_object, 'session')) +g = LocalProxy(partial(_lookup_app_object, 'g')) diff --git a/venv/lib/python3.6/site-packages/flask/helpers.py b/venv/lib/python3.6/site-packages/flask/helpers.py new file mode 100644 index 0000000..df0b91f --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/helpers.py @@ -0,0 +1,1044 @@ +# -*- coding: utf-8 -*- +""" + flask.helpers + ~~~~~~~~~~~~~ + + Implements various helpers. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import socket +import sys +import pkgutil +import posixpath +import mimetypes +from time import time +from zlib import adler32 +from threading import RLock +import unicodedata +from werkzeug.routing import BuildError +from functools import update_wrapper + +from werkzeug.urls import url_quote +from werkzeug.datastructures import Headers, Range +from werkzeug.exceptions import BadRequest, NotFound, \ + RequestedRangeNotSatisfiable + +from werkzeug.wsgi import wrap_file +from jinja2 import FileSystemLoader + +from .signals import message_flashed +from .globals import session, _request_ctx_stack, _app_ctx_stack, \ + current_app, request +from ._compat import string_types, text_type, PY2 + +# sentinel +_missing = object() + + +# what separators does this operating system provide that are not a slash? +# this is used by the send_from_directory function to ensure that nobody is +# able to access files from outside the filesystem. +_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] + if sep not in (None, '/')) + + +def get_env(): + """Get the environment the app is running in, indicated by the + :envvar:`FLASK_ENV` environment variable. The default is + ``'production'``. + """ + return os.environ.get('FLASK_ENV') or 'production' + + +def get_debug_flag(): + """Get whether debug mode should be enabled for the app, indicated + by the :envvar:`FLASK_DEBUG` environment variable. The default is + ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` + otherwise. + """ + val = os.environ.get('FLASK_DEBUG') + + if not val: + return get_env() == 'development' + + return val.lower() not in ('0', 'false', 'no') + + +def get_load_dotenv(default=True): + """Get whether the user has disabled loading dotenv files by setting + :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load the + files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get('FLASK_SKIP_DOTENV') + + if not val: + return default + + return val.lower() in ('0', 'false', 'no') + + +def _endpoint_from_view_func(view_func): + """Internal helper that returns the default endpoint for a given + function. This always is the function name. + """ + assert view_func is not None, 'expected view func if endpoint ' \ + 'is not provided.' + return view_func.__name__ + + +def stream_with_context(generator_or_function): + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) + except TypeError: + def decorator(*args, **kwargs): + gen = generator_or_function(*args, **kwargs) + return stream_with_context(gen) + return update_wrapper(decorator, generator_or_function) + + def generator(): + ctx = _request_ctx_stack.top + if ctx is None: + raise RuntimeError('Attempted to stream with context but ' + 'there was no context in the first place to keep around.') + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + for item in gen: + yield item + finally: + if hasattr(gen, 'close'): + gen.close() + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args): + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) + + +def url_for(endpoint, **values): + """Generates a URL to the given endpoint with the method provided. + + Variable arguments that are unknown to the target endpoint are appended + to the generated URL as query arguments. If the value of a query argument + is ``None``, the whole pair is skipped. In case blueprints are active + you can shortcut references to the same blueprint by prefixing the + local endpoint with a dot (``.``). + + This will reference the index function local to the current blueprint:: + + url_for('.index') + + For more information, head over to the :ref:`Quickstart `. + + To integrate applications, :class:`Flask` has a hook to intercept URL build + errors through :attr:`Flask.url_build_error_handlers`. The `url_for` + function results in a :exc:`~werkzeug.routing.BuildError` when the current + app does not have a URL for the given endpoint and values. When it does, the + :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if + it is not ``None``, which can return a string to use as the result of + `url_for` (instead of `url_for`'s default to raise the + :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. + An example:: + + def external_url_handler(error, endpoint, values): + "Looks up an external URL when `url_for` cannot build a URL." + # This is an example of hooking the build_error_handler. + # Here, lookup_url is some utility function you've built + # which looks up the endpoint in some external URL registry. + url = lookup_url(endpoint, **values) + if url is None: + # External lookup did not have a URL. + # Re-raise the BuildError, in context of original traceback. + exc_type, exc_value, tb = sys.exc_info() + if exc_value is error: + raise exc_type, exc_value, tb + else: + raise error + # url_for will use this result, instead of raising BuildError. + return url + + app.url_build_error_handlers.append(external_url_handler) + + Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and + `endpoint` and `values` are the arguments passed into `url_for`. Note + that this is for building URLs outside the current application, and not for + handling 404 NotFound errors. + + .. versionadded:: 0.10 + The `_scheme` parameter was added. + + .. versionadded:: 0.9 + The `_anchor` and `_method` parameters were added. + + .. versionadded:: 0.9 + Calls :meth:`Flask.handle_build_error` on + :exc:`~werkzeug.routing.BuildError`. + + :param endpoint: the endpoint of the URL (name of the function) + :param values: the variable arguments of the URL rule + :param _external: if set to ``True``, an absolute URL is generated. Server + address can be changed via ``SERVER_NAME`` configuration variable which + defaults to `localhost`. + :param _scheme: a string specifying the desired URL scheme. The `_external` + parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default + behavior uses the same scheme as the current request, or + ``PREFERRED_URL_SCHEME`` from the :ref:`app configuration ` if no + request context is available. As of Werkzeug 0.10, this also can be set + to an empty string to build protocol-relative URLs. + :param _anchor: if provided this is added as anchor to the URL. + :param _method: if provided this explicitly specifies an HTTP method. + """ + appctx = _app_ctx_stack.top + reqctx = _request_ctx_stack.top + + if appctx is None: + raise RuntimeError( + 'Attempted to generate a URL without the application context being' + ' pushed. This has to be executed when application context is' + ' available.' + ) + + # If request specific information is available we have some extra + # features that support "relative" URLs. + if reqctx is not None: + url_adapter = reqctx.url_adapter + blueprint_name = request.blueprint + + if endpoint[:1] == '.': + if blueprint_name is not None: + endpoint = blueprint_name + endpoint + else: + endpoint = endpoint[1:] + + external = values.pop('_external', False) + + # Otherwise go with the url adapter from the appctx and make + # the URLs external by default. + else: + url_adapter = appctx.url_adapter + + if url_adapter is None: + raise RuntimeError( + 'Application was not able to create a URL adapter for request' + ' independent URL generation. You might be able to fix this by' + ' setting the SERVER_NAME config variable.' + ) + + external = values.pop('_external', True) + + anchor = values.pop('_anchor', None) + method = values.pop('_method', None) + scheme = values.pop('_scheme', None) + appctx.app.inject_url_defaults(endpoint, values) + + # This is not the best way to deal with this but currently the + # underlying Werkzeug router does not support overriding the scheme on + # a per build call basis. + old_scheme = None + if scheme is not None: + if not external: + raise ValueError('When specifying _scheme, _external must be True') + old_scheme = url_adapter.url_scheme + url_adapter.url_scheme = scheme + + try: + try: + rv = url_adapter.build(endpoint, values, method=method, + force_external=external) + finally: + if old_scheme is not None: + url_adapter.url_scheme = old_scheme + except BuildError as error: + # We need to inject the values again so that the app callback can + # deal with that sort of stuff. + values['_external'] = external + values['_anchor'] = anchor + values['_method'] = method + values['_scheme'] = scheme + return appctx.app.handle_url_build_error(error, endpoint, values) + + if anchor is not None: + rv += '#' + url_quote(anchor) + return rv + + +def get_template_attribute(template_name, attribute): + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, + attribute) + + +def flash(message, category='message'): + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get('_flashes', []) + flashes.append((category, message)) + session['_flashes'] = flashes + message_flashed.send(current_app._get_current_object(), + message=message, category=category) + + +def get_flashed_messages(with_categories=False, category_filter=[]): + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :ref:`message-flashing-pattern` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: whitelist of categories to limit return values + """ + flashes = _request_ctx_stack.top.flashes + if flashes is None: + _request_ctx_stack.top.flashes = flashes = session.pop('_flashes') \ + if '_flashes' in session else [] + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def send_file(filename_or_fp, mimetype=None, as_attachment=False, + attachment_filename=None, add_etags=True, + cache_timeout=None, conditional=False, last_modified=None): + """Sends the contents of a file to the client. This will use the + most efficient method available and configured. By default it will + try to use the WSGI server's file_wrapper support. Alternatively + you can set the application's :attr:`~Flask.use_x_sendfile` attribute + to ``True`` to directly emit an ``X-Sendfile`` header. This however + requires support of the underlying webserver for ``X-Sendfile``. + + By default it will try to guess the mimetype for you, but you can + also explicitly provide one. For extra security you probably want + to send certain files as attachment (HTML for instance). The mimetype + guessing requires a `filename` or an `attachment_filename` to be + provided. + + ETags will also be attached automatically if a `filename` is provided. You + can turn this off by setting `add_etags=False`. + + If `conditional=True` and `filename` is provided, this method will try to + upgrade the response stream to support range requests. This will allow + the request to be answered with partial content response. + + Please never pass filenames to this function from user sources; + you should use :func:`send_from_directory` instead. + + .. versionadded:: 0.2 + + .. versionadded:: 0.5 + The `add_etags`, `cache_timeout` and `conditional` parameters were + added. The default behavior is now to attach etags. + + .. versionchanged:: 0.7 + mimetype guessing and etag support for file objects was + deprecated because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. This functionality + will be removed in Flask 1.0 + + .. versionchanged:: 0.9 + cache_timeout pulls its default from application config, when None. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file objects. If + you want to use automatic mimetype and etag support, pass a filepath via + `filename_or_fp` or `attachment_filename`. + + .. versionchanged:: 0.12 + The `attachment_filename` is preferred over `filename` for MIME-type + detection. + + .. versionchanged:: 1.0 + UTF-8 filenames, as specified in `RFC 2231`_, are supported. + + .. _RFC 2231: https://tools.ietf.org/html/rfc2231#section-4 + + :param filename_or_fp: the filename of the file to send. + This is relative to the :attr:`~Flask.root_path` + if a relative path is specified. + Alternatively a file object might be provided in + which case ``X-Sendfile`` might not work and fall + back to the traditional method. Make sure that the + file pointer is positioned at the start of data to + send before calling :func:`send_file`. + :param mimetype: the mimetype of the file if provided. If a file path is + given, auto detection happens as fallback, otherwise an + error will be raised. + :param as_attachment: set to ``True`` if you want to send this file with + a ``Content-Disposition: attachment`` header. + :param attachment_filename: the filename for the attachment if it + differs from the file's filename. + :param add_etags: set to ``False`` to disable attaching of etags. + :param conditional: set to ``True`` to enable conditional responses. + + :param cache_timeout: the timeout in seconds for the headers. When ``None`` + (default), this value is set by + :meth:`~Flask.get_send_file_max_age` of + :data:`~flask.current_app`. + :param last_modified: set the ``Last-Modified`` header to this value, + a :class:`~datetime.datetime` or timestamp. + If a file was passed, this overrides its mtime. + """ + mtime = None + fsize = None + if isinstance(filename_or_fp, string_types): + filename = filename_or_fp + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + file = None + if attachment_filename is None: + attachment_filename = os.path.basename(filename) + else: + file = filename_or_fp + filename = None + + if mimetype is None: + if attachment_filename is not None: + mimetype = mimetypes.guess_type(attachment_filename)[0] \ + or 'application/octet-stream' + + if mimetype is None: + raise ValueError( + 'Unable to infer MIME-type because no filename is available. ' + 'Please set either `attachment_filename`, pass a filepath to ' + '`filename_or_fp` or set your own MIME-type via `mimetype`.' + ) + + headers = Headers() + if as_attachment: + if attachment_filename is None: + raise TypeError('filename unavailable, required for ' + 'sending as attachment') + + try: + attachment_filename = attachment_filename.encode('latin-1') + except UnicodeEncodeError: + filenames = { + 'filename': unicodedata.normalize( + 'NFKD', attachment_filename).encode('latin-1', 'ignore'), + 'filename*': "UTF-8''%s" % url_quote(attachment_filename), + } + else: + filenames = {'filename': attachment_filename} + + headers.add('Content-Disposition', 'attachment', **filenames) + + if current_app.use_x_sendfile and filename: + if file is not None: + file.close() + headers['X-Sendfile'] = filename + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize + data = None + else: + if file is None: + file = open(filename, 'rb') + mtime = os.path.getmtime(filename) + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize + data = wrap_file(request.environ, file) + + rv = current_app.response_class(data, mimetype=mimetype, headers=headers, + direct_passthrough=True) + + if last_modified is not None: + rv.last_modified = last_modified + elif mtime is not None: + rv.last_modified = mtime + + rv.cache_control.public = True + if cache_timeout is None: + cache_timeout = current_app.get_send_file_max_age(filename) + if cache_timeout is not None: + rv.cache_control.max_age = cache_timeout + rv.expires = int(time() + cache_timeout) + + if add_etags and filename is not None: + from warnings import warn + + try: + rv.set_etag('%s-%s-%s' % ( + os.path.getmtime(filename), + os.path.getsize(filename), + adler32( + filename.encode('utf-8') if isinstance(filename, text_type) + else filename + ) & 0xffffffff + )) + except OSError: + warn('Access %s failed, maybe it does not exist, so ignore etags in ' + 'headers' % filename, stacklevel=2) + + if conditional: + try: + rv = rv.make_conditional(request, accept_ranges=True, + complete_length=fsize) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + raise + # make sure we don't send x-sendfile for servers that + # ignore the 304 status code for x-sendfile. + if rv.status_code == 304: + rv.headers.pop('x-sendfile', None) + return rv + + +def safe_join(directory, *pathnames): + """Safely join `directory` and zero or more untrusted `pathnames` + components. + + Example usage:: + + @app.route('/wiki/') + def wiki_page(filename): + filename = safe_join(app.config['WIKI_FOLDER'], filename) + with open(filename, 'rb') as fd: + content = fd.read() # Read and process the file content... + + :param directory: the trusted base directory. + :param pathnames: the untrusted pathnames relative to that directory. + :raises: :class:`~werkzeug.exceptions.NotFound` if one or more passed + paths fall out of its boundaries. + """ + + parts = [directory] + + for filename in pathnames: + if filename != '': + filename = posixpath.normpath(filename) + + if ( + any(sep in filename for sep in _os_alt_seps) + or os.path.isabs(filename) + or filename == '..' + or filename.startswith('../') + ): + raise NotFound() + + parts.append(filename) + + return posixpath.join(*parts) + + +def send_from_directory(directory, filename, **options): + """Send a file from a given directory with :func:`send_file`. This + is a secure way to quickly expose static files from an upload folder + or something similar. + + Example usage:: + + @app.route('/uploads/') + def download_file(filename): + return send_from_directory(app.config['UPLOAD_FOLDER'], + filename, as_attachment=True) + + .. admonition:: Sending files and Performance + + It is strongly recommended to activate either ``X-Sendfile`` support in + your webserver or (if no authentication happens) to tell the webserver + to serve files for the given path on its own without calling into the + web application for improved performance. + + .. versionadded:: 0.5 + + :param directory: the directory where all the files are stored. + :param filename: the filename relative to that directory to + download. + :param options: optional keyword arguments that are directly + forwarded to :func:`send_file`. + """ + filename = safe_join(directory, filename) + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + try: + if not os.path.isfile(filename): + raise NotFound() + except (TypeError, ValueError): + raise BadRequest() + options.setdefault('conditional', True) + return send_file(filename, **options) + + +def get_root_path(import_name): + """Returns the path to a package or cwd if that cannot be found. This + returns the path of a package or the folder that contains a module. + + Not to be confused with the package path returned by :func:`find_package`. + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + if mod is not None and hasattr(mod, '__file__'): + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + loader = pkgutil.get_loader(import_name) + + # Loader does not exist or we're referring to an unloaded main module + # or a main module without path (interactive sessions), go with the + # current working directory. + if loader is None or import_name == '__main__': + return os.getcwd() + + # For .egg, zipimporter does not have get_filename until Python 2.7. + # Some other loaders might exhibit the same behavior. + if hasattr(loader, 'get_filename'): + filepath = loader.get_filename(import_name) + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, '__file__', None) + + # If we don't have a filepath it might be because we are a + # namespace package. In this case we pick the root path from the + # first module that is contained in our package. + if filepath is None: + raise RuntimeError('No root path can be found for the provided ' + 'module "%s". This can happen because the ' + 'module came from an import hook that does ' + 'not provide file name information or because ' + 'it\'s a namespace package. In this case ' + 'the root path needs to be explicitly ' + 'provided.' % import_name) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +def _matching_loader_thinks_module_is_package(loader, mod_name): + """Given the loader that loaded a module and the module this function + attempts to figure out if the given module is actually a package. + """ + # If the loader can tell us if something is a package, we can + # directly ask the loader. + if hasattr(loader, 'is_package'): + return loader.is_package(mod_name) + # importlib's namespace loaders do not have this functionality but + # all the modules it loads are packages, so we can take advantage of + # this information. + elif (loader.__class__.__module__ == '_frozen_importlib' and + loader.__class__.__name__ == 'NamespaceLoader'): + return True + # Otherwise we need to fail with an error that explains what went + # wrong. + raise AttributeError( + ('%s.is_package() method is missing but is required by Flask of ' + 'PEP 302 import hooks. If you do not use import hooks and ' + 'you encounter this error please file a bug against Flask.') % + loader.__class__.__name__) + + +def find_package(import_name): + """Finds a package and returns the prefix (or None if the package is + not installed) as well as the folder that contains the package or + module as a tuple. The package path returned is the module that would + have to be added to the pythonpath in order to make it possible to + import the module. The prefix is the path below which a UNIX like + folder structure exists (lib, share etc.). + """ + root_mod_name = import_name.split('.')[0] + loader = pkgutil.get_loader(root_mod_name) + if loader is None or import_name == '__main__': + # import name is not found, or interactive/main module + package_path = os.getcwd() + else: + # For .egg, zipimporter does not have get_filename until Python 2.7. + if hasattr(loader, 'get_filename'): + filename = loader.get_filename(root_mod_name) + elif hasattr(loader, 'archive'): + # zipimporter's loader.archive points to the .egg or .zip + # archive filename is dropped in call to dirname below. + filename = loader.archive + else: + # At least one loader is missing both get_filename and archive: + # Google App Engine's HardenedModulesHook + # + # Fall back to imports. + __import__(import_name) + filename = sys.modules[import_name].__file__ + package_path = os.path.abspath(os.path.dirname(filename)) + + # In case the root module is a package we need to chop of the + # rightmost part. This needs to go through a helper function + # because of python 3.3 namespace packages. + if _matching_loader_thinks_module_is_package( + loader, root_mod_name): + package_path = os.path.dirname(package_path) + + site_parent, site_folder = os.path.split(package_path) + py_prefix = os.path.abspath(sys.prefix) + if package_path.startswith(py_prefix): + return py_prefix, package_path + elif site_folder.lower() == 'site-packages': + parent, folder = os.path.split(site_parent) + # Windows like installations + if folder.lower() == 'lib': + base_dir = parent + # UNIX like installations + elif os.path.basename(parent).lower() == 'lib': + base_dir = os.path.dirname(parent) + else: + base_dir = site_parent + return base_dir, package_path + return None, package_path + + +class locked_cached_property(object): + """A decorator that converts a function into a lazy property. The + function wrapped is called the first time to retrieve the result + and then that calculated result is used the next time you access + the value. Works like the one in Werkzeug but has a lock for + thread safety. + """ + + def __init__(self, func, name=None, doc=None): + self.__name__ = name or func.__name__ + self.__module__ = func.__module__ + self.__doc__ = doc or func.__doc__ + self.func = func + self.lock = RLock() + + def __get__(self, obj, type=None): + if obj is None: + return self + with self.lock: + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + value = self.func(obj) + obj.__dict__[self.__name__] = value + return value + + +class _PackageBoundObject(object): + #: The name of the package or module that this app belongs to. Do not + #: change this once it is set by the constructor. + import_name = None + + #: Location of the template files to be added to the template lookup. + #: ``None`` if templates should not be added. + template_folder = None + + #: Absolute path to the package on the filesystem. Used to look up + #: resources contained in the package. + root_path = None + + def __init__(self, import_name, template_folder=None, root_path=None): + self.import_name = import_name + self.template_folder = template_folder + + if root_path is None: + root_path = get_root_path(self.import_name) + + self.root_path = root_path + self._static_folder = None + self._static_url_path = None + + def _get_static_folder(self): + if self._static_folder is not None: + return os.path.join(self.root_path, self._static_folder) + + def _set_static_folder(self, value): + self._static_folder = value + + static_folder = property( + _get_static_folder, _set_static_folder, + doc='The absolute path to the configured static folder.' + ) + del _get_static_folder, _set_static_folder + + def _get_static_url_path(self): + if self._static_url_path is not None: + return self._static_url_path + + if self.static_folder is not None: + return '/' + os.path.basename(self.static_folder) + + def _set_static_url_path(self, value): + self._static_url_path = value + + static_url_path = property( + _get_static_url_path, _set_static_url_path, + doc='The URL prefix that the static route will be registered for.' + ) + del _get_static_url_path, _set_static_url_path + + @property + def has_static_folder(self): + """This is ``True`` if the package bound object's container has a + folder for static files. + + .. versionadded:: 0.5 + """ + return self.static_folder is not None + + @locked_cached_property + def jinja_loader(self): + """The Jinja loader for this package bound object. + + .. versionadded:: 0.5 + """ + if self.template_folder is not None: + return FileSystemLoader(os.path.join(self.root_path, + self.template_folder)) + + def get_send_file_max_age(self, filename): + """Provides default cache_timeout for the :func:`send_file` functions. + + By default, this function returns ``SEND_FILE_MAX_AGE_DEFAULT`` from + the configuration of :data:`~flask.current_app`. + + Static file functions such as :func:`send_from_directory` use this + function, and :func:`send_file` calls this function on + :data:`~flask.current_app` when the given cache_timeout is ``None``. If a + cache_timeout is given in :func:`send_file`, that timeout is used; + otherwise, this method is called. + + This allows subclasses to change the behavior when sending files based + on the filename. For example, to set the cache timeout for .js files + to 60 seconds:: + + class MyFlask(flask.Flask): + def get_send_file_max_age(self, name): + if name.lower().endswith('.js'): + return 60 + return flask.Flask.get_send_file_max_age(self, name) + + .. versionadded:: 0.9 + """ + return total_seconds(current_app.send_file_max_age_default) + + def send_static_file(self, filename): + """Function used internally to send static files from the static + folder to the browser. + + .. versionadded:: 0.5 + """ + if not self.has_static_folder: + raise RuntimeError('No static folder for this object') + # Ensure get_send_file_max_age is called in all cases. + # Here, we ensure get_send_file_max_age is called for Blueprints. + cache_timeout = self.get_send_file_max_age(filename) + return send_from_directory(self.static_folder, filename, + cache_timeout=cache_timeout) + + def open_resource(self, resource, mode='rb'): + """Opens a resource from the application's resource folder. To see + how this works, consider the following folder structure:: + + /myapplication.py + /schema.sql + /static + /style.css + /templates + /layout.html + /index.html + + If you want to open the :file:`schema.sql` file you would do the + following:: + + with app.open_resource('schema.sql') as f: + contents = f.read() + do_something_with(contents) + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + if mode not in ('r', 'rb'): + raise ValueError('Resources can only be opened for reading') + return open(os.path.join(self.root_path, resource), mode) + + +def total_seconds(td): + """Returns the total seconds from a timedelta object. + + :param timedelta td: the timedelta to be converted in seconds + + :returns: number of seconds + :rtype: int + """ + return td.days * 60 * 60 * 24 + td.seconds + + +def is_ip(value): + """Determine if the given string is an IP address. + + Python 2 on Windows doesn't provide ``inet_pton``, so this only + checks IPv4 addresses in that environment. + + :param value: value to check + :type value: str + + :return: True if string is an IP address + :rtype: bool + """ + if PY2 and os.name == 'nt': + try: + socket.inet_aton(value) + return True + except socket.error: + return False + + for family in (socket.AF_INET, socket.AF_INET6): + try: + socket.inet_pton(family, value) + except socket.error: + pass + else: + return True + + return False diff --git a/venv/lib/python3.6/site-packages/flask/json/__init__.py b/venv/lib/python3.6/site-packages/flask/json/__init__.py new file mode 100644 index 0000000..fbe6b92 --- /dev/null +++ b/venv/lib/python3.6/site-packages/flask/json/__init__.py @@ -0,0 +1,327 @@ +# -*- coding: utf-8 -*- +""" +flask.json +~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" +import codecs +import io +import uuid +from datetime import date, datetime +from flask.globals import current_app, request +from flask._compat import text_type, PY2 + +from werkzeug.http import http_date +from jinja2 import Markup + +# Use the same json implementation as itsdangerous on which we +# depend anyways. +from itsdangerous import json as _json + + +# Figure out if simplejson escapes slashes. This behavior was changed +# from one version to another without reason. +_slash_escape = '\\/' not in _json.dumps('/') + + +__all__ = ['dump', 'dumps', 'load', 'loads', 'htmlsafe_dump', + 'htmlsafe_dumps', 'JSONDecoder', 'JSONEncoder', + 'jsonify'] + + +def _wrap_reader_for_text(fp, encoding): + if isinstance(fp.read(0), bytes): + fp = io.TextIOWrapper(io.BufferedReader(fp), encoding) + return fp + + +def _wrap_writer_for_text(fp, encoding): + try: + fp.write('') + except TypeError: + fp = io.TextIOWrapper(fp, encoding) + return fp + + +class JSONEncoder(_json.JSONEncoder): + """The default Flask JSON encoder. This one extends the default simplejson + encoder by also supporting ``datetime`` objects, ``UUID`` as well as + ``Markup`` objects which are serialized as RFC 822 datetime strings (same + as the HTTP date format). In order to support more data types override the + :meth:`default` method. + """ + + def default(self, o): + """Implement this method in a subclass such that it returns a + serializable object for ``o``, or calls the base implementation (to + raise a :exc:`TypeError`). + + For example, to support arbitrary iterators, you could implement + default like this:: + + def default(self, o): + try: + iterable = iter(o) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder.default(self, o) + """ + if isinstance(o, datetime): + return http_date(o.utctimetuple()) + if isinstance(o, date): + return http_date(o.timetuple()) + if isinstance(o, uuid.UUID): + return str(o) + if hasattr(o, '__html__'): + return text_type(o.__html__()) + return _json.JSONEncoder.default(self, o) + + +class JSONDecoder(_json.JSONDecoder): + """The default JSON decoder. This one does not change the behavior from + the default simplejson decoder. Consult the :mod:`json` documentation + for more information. This decoder is not only used for the load + functions of this module but also :attr:`~flask.Request`. + """ + + +def _dump_arg_defaults(kwargs): + """Inject default arguments for dump functions.""" + if current_app: + bp = current_app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', + bp.json_encoder if bp and bp.json_encoder + else current_app.json_encoder + ) + + if not current_app.config['JSON_AS_ASCII']: + kwargs.setdefault('ensure_ascii', False) + + kwargs.setdefault('sort_keys', current_app.config['JSON_SORT_KEYS']) + else: + kwargs.setdefault('sort_keys', True) + kwargs.setdefault('cls', JSONEncoder) + + +def _load_arg_defaults(kwargs): + """Inject default arguments for load functions.""" + if current_app: + bp = current_app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', + bp.json_decoder if bp and bp.json_decoder + else current_app.json_decoder + ) + else: + kwargs.setdefault('cls', JSONDecoder) + + +def detect_encoding(data): + """Detect which UTF codec was used to encode the given bytes. + + The latest JSON standard (:rfc:`8259`) suggests that only UTF-8 is + accepted. Older documents allowed 8, 16, or 32. 16 and 32 can be big + or little endian. Some editors or libraries may prepend a BOM. + + :param data: Bytes in unknown UTF encoding. + :return: UTF encoding name + """ + head = data[:4] + + if head[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' + + if b'\x00' not in head: + return 'utf-8' + + if head in (codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE): + return 'utf-32' + + if head[:2] in (codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE): + return 'utf-16' + + if len(head) == 4: + if head[:3] == b'\x00\x00\x00': + return 'utf-32-be' + + if head[::2] == b'\x00\x00': + return 'utf-16-be' + + if head[1:] == b'\x00\x00\x00': + return 'utf-32-le' + + if head[1::2] == b'\x00\x00': + return 'utf-16-le' + + if len(head) == 2: + return 'utf-16-be' if head.startswith(b'\x00') else 'utf-16-le' + + return 'utf-8' + + +def dumps(obj, **kwargs): + """Serialize ``obj`` to a JSON formatted ``str`` by using the application's + configured encoder (:attr:`~flask.Flask.json_encoder`) if there is an + application on the stack. + + This function can return ``unicode`` strings or ascii-only bytestrings by + default which coerce into unicode strings automatically. That behavior by + default is controlled by the ``JSON_AS_ASCII`` configuration variable + and can be overridden by the simplejson ``ensure_ascii`` parameter. + """ + _dump_arg_defaults(kwargs) + encoding = kwargs.pop('encoding', None) + rv = _json.dumps(obj, **kwargs) + if encoding is not None and isinstance(rv, text_type): + rv = rv.encode(encoding) + return rv + + +def dump(obj, fp, **kwargs): + """Like :func:`dumps` but writes into a file object.""" + _dump_arg_defaults(kwargs) + encoding = kwargs.pop('encoding', None) + if encoding is not None: + fp = _wrap_writer_for_text(fp, encoding) + _json.dump(obj, fp, **kwargs) + + +def loads(s, **kwargs): + """Unserialize a JSON object from a string ``s`` by using the application's + configured decoder (:attr:`~flask.Flask.json_decoder`) if there is an + application on the stack. + """ + _load_arg_defaults(kwargs) + if isinstance(s, bytes): + encoding = kwargs.pop('encoding', None) + if encoding is None: + encoding = detect_encoding(s) + s = s.decode(encoding) + return _json.loads(s, **kwargs) + + +def load(fp, **kwargs): + """Like :func:`loads` but reads from a file object. + """ + _load_arg_defaults(kwargs) + if not PY2: + fp = _wrap_reader_for_text(fp, kwargs.pop('encoding', None) or 'utf-8') + return _json.load(fp, **kwargs) + + +def htmlsafe_dumps(obj, **kwargs): + """Works exactly like :func:`dumps` but is safe for use in `` +

+''' + +__all__ = ["RecaptchaWidget"] + + +class RecaptchaWidget(object): + + def recaptcha_html(self, public_key): + html = current_app.config.get('RECAPTCHA_HTML') + if html: + return Markup(html) + params = current_app.config.get('RECAPTCHA_PARAMETERS') + script = RECAPTCHA_SCRIPT + if params: + script += u'?' + url_encode(params) + + attrs = current_app.config.get('RECAPTCHA_DATA_ATTRS', {}) + attrs['sitekey'] = public_key + snippet = u' '.join([u'data-%s="%s"' % (k, attrs[k]) for k in attrs]) + return Markup(RECAPTCHA_TEMPLATE % (script, snippet)) + + def __call__(self, field, error=None, **kwargs): + """Returns the recaptcha input HTML.""" + + try: + public_key = current_app.config['RECAPTCHA_PUBLIC_KEY'] + except KeyError: + raise RuntimeError("RECAPTCHA_PUBLIC_KEY config not set") + + return self.recaptcha_html(public_key) diff --git a/venv/lib/python3.6/site-packages/google/api/__init__.py b/venv/lib/python3.6/site-packages/google/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45b8a752ed3ed91f745efdbaebcd7a4287c53450 GIT binary patch literal 154 zcmXr!<>lgiz!$>+1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFL(Wt+yecA%mUq{ z(#)I`-P|H0!@|VW6#ex4{PdjE#DdIX-Q@h--26PqtK2SzKK0Y%qvm`!V Xub}c4hfQvNN@-529ms-WAZ7pnhc70- literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/annotations_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/annotations_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9687a0da116d2b74a3ce2e58516c719f2577a62 GIT binary patch literal 1891 zcmcgtOK%%D5MHiUtJUf)%kR`RioSHP)Hs)-4T9RS+!#n~Lvb!d0b*CARoM$*ui-k_v%?iyq$OHrI<4FwkX4Y?VT09& zje$;UA57e!b-W6mYjlM+AX1&K(lxqHHz=BYo3dvOy7i%o*V#I23^(Y?Q;n5|o2+qz zV4v!6i>;Gwi27*w5nGpYas}C;=(X0|o&W>d=_CWPholZa*~|7EnlM1T*T5B>{t6;R zS6n(P@%L#v3F3C_#e43^^XXo|_aFc0FxnnO(ZFX;?1{Zz6a-PY7xO5I#LUnJOWO&< zC~*=m3I&PX{Z>3qt*5>dxYT);m0Ls8xC!DOG94xqG8>fl+7QyYk*VmXsp&(w@G+n? zS=fsxYa%Z3FA#GXSjD{C0laO>M2~xM5^)&i0w#nrfW@iJS>IF%I0wC)7zC z*Addex=fN-q6fXah$3gMA5BSkm}^ThacxhnEnothYU;@-0&sR22x~2jht-1xPv?@v zbA%6O_Ce%3;h+`qL3_YL6=jL~hdY0}#Q5zmy7B$N`N`;WIBEMoq1Kn6ZmljQC3Bx< zv$Z>$RuJ4#zrEmM>hVp-Hl%-jXP(>Kwe^Z6mk~XSRV8fP{`SYux4(a~i@q%EH|D-T zQtJh*?v8wR82--`xwGSGnyC>w0ZVhS(|ZdAf=w|F6Xz(|QMV*PlL8dMMAr61-ofLGW|db!!TJ8k_lW|K^&rw! zYKEi0Wjr;Kam=vQi(?|SH0wJq^KtFc5rne7Gx8Ji&hbYqE!`g$XO*s&;XH$QQ?=5I zATclW!ohT+=n2BE5*7-$3b=Bo648rd#%lmDHTs^iZA zqVsd-d6`uK5YF!&mszJ4nW5s632<24L0*(IRr25-;@r_ROPrG?LS4L6vb-c0%_^MG zC?QZys+V*Vc~yB?x_mJ`31ymtRD%UV<&De7km%7JY-}HOUO(@ioL`)EaqY#$#W^`X z>AXB5r*B>zcDlH7>@lA%{JH%5!Sy>11#!pfT=80$4Lp%B{$PVVkx{#EUUvAlTwA(# zWpHi2tTR6$AaPcQOHZGAw&k-2&ukD;xJu9D<0!rcVWAyVoPHTA16syFy829H>QxvS Q$V8Ts2C{VRq(T1>#z=rM#;h^BmI$!B*^M1%vB50K8i1Kvxu`Sw|foVuWiiRM4 zE@PR>X@2WypSrksKmsVFq#_Q~pL9H((ZSpp6jB!A&gZ>*%d`=6Q*z{D-W-6<`4t zVd*klJye(YgPQY@64EVLhT9*qWKN8{0(SxyTaTD&HcRk=% zhJ9Fv`-t2SKA?v1lVeA5AHyezdH_Wzamzk(6t@XK!@@x_u-kaT@bbp;Ol_xL-_U8ZKM7TcnH6_dj2n1;orb>;mrb_r*n-( zm@P=^63q*_Amjp_$M$t0BMRkBAGxfx-RQ z8*A6c6nxA*fx+F{!yNdS1s}66FzXz{XGy&e@(XF>q{GSbs1wGrDsvfs{L9~`_}URH z-b)CTkG{jglix887R7%KHl1c`v!%C+m9}m`vB|c#zSSsf)-9`UP_3og#j4e8T4u4u zEXT5Y9h=y*skNO~YOAtcYMpuUM~2p{fc6+^TC(w#SPY9HmqOSeTvAYYFEucZa~?zJ z$cq`8qnlgkUW}Sm3+RT-xZ?v?88<9!`XeA(0cuy7-f}F4wW%hxZLN;Vp2BF&pjAh= zOsr+>vu4FIRL~r)qS+jf(M;2Fa8%2*c@XYgH)KDuk_gyUy3HjFn8ZZWPTN3Nlr-k0 zH0XSi*u`|5@FbncWWU!@w+zj!mn>G_tW#5{2U07>vMGC`S83HUYkK|RQ0@Cahav~N zCx`97VCs~M9n1wBTv!UmFo>@k%BrEHxsTLz^r{FvS5%^`ZBRQOUJ2iy-d+yGQyPYr z5tjQzNni+XbfC=6M}$g#R0T620IT1BCo8!NjAWI#P5IPVEHAIf_Y=7XO4QQOv3v-t z)7!U#CXcy=GX1u#GulMY?c9oz*9^mYtG?BpS616mtBeAVNi*_MG!V~iDM=R4$WIAR z7lUR;tgbecByZ|FpHq~O4n6nMN=&!yHf6%UL=FRJynSt}ZKh-1cmOj>LTiJLD;HB4 z5lsbUhKFP^-4&@ubl1JaYEhXPk1DTZtD0$Xo10ap`}3gs zZVoxYGnshu`v18|E4|&Z5%VIZ)}-E4ORK)d-RQ;aGt<%Dc{yC%I7_-qLA6?9=aE#P ztyLjOpe<_RbXIk0dn3!$Eey8X$nx~M>)5?L5m6Egy)%tlx5N48*+!P7@#`gOZNpH7 z$59=Je&@x^cC$j67je#7l*Fs8mdYhBYG@T|keOGStpcrSZNpLDXhxfQso`p}$3sGm zBq-YJTFBrocQoD9&3d;lsoN@j=TOr|9wHfE>@EQ|!ySy&bc2$?&U5ch4zj;2><;Ju z4yVu#r`*n8vFJt2ZldhPxm6xDTgEE8#oJ;vof=?!itmR_k|wnsoG_jN-qVl87S54W zKLF4w24z_^L$bcQ%8>o2O=6Zwt(r};f!VeljX5M8Xu*m1E?^Az*2H)@D|tShxc4pv zmin~QN$_ALH`;b;#V<&gd@ji6>kGLe7W&o6gi5^r_*k=BXxVv4&qL|^X5 zmm3XIUFUD8uKynA-W%dGcYef1pXfZKId@?~XGsUrqds?eB1TXn@hQ<=nS|_2cXpRJCaVu6h89Vf_CbWG;Aa z*!@0ovrOwck}w+%ge)CUlQIq28Mm`zRW0Lr_x^jzPphe3#fyMmby$uMkm+0M^|5tq zWm~-1;l-y|;8gVv=fLG#{Kddo3NQNIMe&%QE%x7WLB-`|IoW-}@o+L6kwfB%$+1u} z+OJ_-C?dz?xXjB)@7u2_A^ahttJ#&}k#XJh1-e}ueM`f&|IP03C_i1h-YC~Y_v7h$ XaiMOwmwj0oJfSqsff81J>Kpzqe@uHA literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/backend_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/backend_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c154423e180bec49e73912fb6dbdfc194e974b4e GIT binary patch literal 2762 zcmcgtOK;mo5av>E>S-o^C4S{utBs{RE(IC{jbkTBAFkn~K)WqKkeZcBg(BHqDzJsz z)JqTk6TS7^OV9loJQe6kf1#(&lA=V_HQH0T;BaR>wEjUjiMj zp!ch=3@f0*Y7b+J#;T-fwRYa-r~aqDmmuAeuk9(mk=&6LM2*p58zzz+Id z#rS8>&Dw8vFYF7@7o_tEl$f3xjnFJyTS z_M$A8*)r4nE1<6{#wycUy}t&H#|la%w}D)>zs~Aof~QdGUxNlK^sjdb+h97hpna~6 zGjtPew%F#(W@BcvJhR!3Y__G1tf#R9nq-i6h~)8+U->@6S7edAQ_z$g z{fs0er(7CG-Z>z=SY+xH!}}>pH9x*q)2Cx;PtH zo@0O+n3gHnXe~}Lok=UoaiqnX7UoFvk?7IT!>zR%mZCLR?pOBX3LMMQ920st)%85b zbbBq2_u4(?MjlcHjdm1_zqLE8JpghxhOdwM)a)Q(@kGpcSUE z=y$aoA398|k)6zL`Qd6R;MUaU1obz+(#ol+-q4DI$#QudSCZY5Ue^jH0LOZ+sgVFp zfSKUfE?di>gy>hb%D{GwnKUb<`|kf-C~JC1&0Lsu%>fGwKAsDLAk2$1H!x2_9Sdxm zjy+;vc)mo0pw*Pjx5A`;BYl3rNxj0jq6uUqFcMWOs`W(Pwnfyohh)KU32IJ##_@Fvaq^1txN$P zEu$rd{$dYx#8P0|uI=_>UBwm#I}MmCFkfu%32TUs=QG}r0cN|l!zQ~j@UM|faVZ4rRXk)hA;CNG* zpn1<_URTgY>QqEv@_^P-66`i%8nvU9i-#q_9nP>k+Wu#YRs!}(N#>=Da>Jmz_hFbo zezbMTy6Kge$W9i{?!%?qBv)f1TNYioEu&kPY>~cF6WIbM-$?Qcl7)n=dH-#yp>}Zi z>e(lL{{$vfiTvmdX5q?QO zU#j7Y;ei|!fUkdBwrmqa8wx^lvLHe!`8 z217SqFqd%?K^%4Rj^}(H|3zNQt67*%!YtUGfG^1n>WQbRj^9BkR%+T@Qva;zUn>tE z|BvyRJdsB#ennCwTci??Ofi=wYBchsl23S)s9BOHMIvdIXevG^i!EcWn7wFSi>%{S bMY1?6F6iRfKl;s7h$e?x!??7}?3?)ufNBvu literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/billing_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/billing_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43e88816de4a1a9d62d0fbc9b6a8228e123e8551 GIT binary patch literal 2813 zcmcf@%Wm67kV{IGMC)ZGmTbpy>^MoSCYF)p5}-lQI4`(J9V78+QGg)1E0zjHvb$7Z z3%RLRpL*)8=&iqz&mejz(33u(m!3Miq%1mdfSjrYXJ=<;X6LoDx?igqwZG~={L@sF zzm?o?1@Ld-<9{MWAqqjhf)%O^5K&eXqP|twI?+hsXC=BpieknpaOu7_EZ`y%5+%TO zT#|Sh@G`DQyaKp^7mz|12GxmzYrt#x^nar%fqwg{%SRRVks8 zjtlhh!R}ll~9a59nI=MzRPMf$bZP+B&b2e;|8(_mta*KRLKBp163T?Xpb2_&( zogLbtZF8BnX=kuPwpJ8#6)3I26|(tIp|!ypZA}owr!u%oHfd?F-beJBTrHlh+N4Xq zK2;|g?ErTBRGVmc17tVphLn}q;JUzt<>nSaZBRfOA%q)oAM!M4jx3Mls_eUXEW7Hu!z4_)| zbuSIdp@`NY!q2ijH}tK*?S;(Ub!i|qRQg3oTI5j*FXG%j8bN6>zT0xr}EK|G83W+X-I>zT;9;O7w+B4IoQi& zX7kfI`|4w(mF?!JtyQB1<>NtmC@~r3;fOhO8Ev5LN~>W&zGCJ%d|8E~Dtp2I98fz; zW>-%NfisaG@=24s`V&OE{MVS z=Db2?ft$^_P~i&#HGc3#qPaS^@ApQO3nl+~0Z7ZL&HLl1hK%`=)fb=z-p2RPPBOcS7b<-i6nAS_bo`3j&C? zJADCQ+|Ehc^G4oP6XWT#H&0&gA0EAWofxJ$49Uo+rrFh43k2D10qy|k-bgfl!jtMd z%0wznFX)GfYTCGw>6UHI9`%{1LcAb)OV+8GFeE9PSZ# z2ysblnZ(Aqp2uoJXe&M4Bw=hqzfR{|rx&dr*PlZjz}=hKBfP@KoPZn8MN!NNiB6z3 z6N;~xd;2e6?jO9E%@D4m{e#Cx`>zggc}A3#h3jc$nf8giY-~-OvXs9me71+%uc_-n z&9U>A;k6eupv;0|ly8a?`roHd+>yASrEHNDi08!YmN=j>)0FMWyg{(D_LX~3M inPTNLO>@~fH|YI{TL&8q&{S9JaDKU+Cr zaWhw+xpU*pf53s_Z=4gozLs}{}w(! zT~w6+DUsh2@*m;j=VFQi3aGY16sq)8P!<)?zEs!>#325y;$4G;coPk^l6I^gCvjEG zNZE;glB6V`Mm|k4lFuNoldR-*f}UZUJxfT*9L!^jN*17sEh=UT>VLy%o5I zzK3mHyix!4vyz`B}aOOJXCHFSG1Mi-d$g0HS4&064@gBU7tNqRBy6P*oKY)AE_8Og~ ztG%nRxu_WHbWQRNf^4J;eB`fU5wS0;r<*LAx#H9gDUYPuh<<4P1Xb(7=&K+jTlt*JyuXI$dgbt?jyZ!qfL`v)=;qenKpckHV5jF8HRQK>DU5 z^NrHOfKEj)+96NcW?(tD(9a}w+Ah$V%0vX`J~Lrh+MKR{+GXkt`bKc#QR8c7dLCsc z)PeeKW_f`tdZ|A3eY1-exz1?ErtQFT9qbkTlYYy!4KM?dP!GrJ z2m(n;(d_|4uk-?9RX-nmP;N?yni8R70pPJpnq!5oYa?)VmvtLm>PRyY*dvRF0Dlm| z9d>^DUW-56IX)Qti2JPng};@Ezw1AJr|P+=Ta}`oqBiYQC#b4x>h(;etY=&sjOV63 zpjB-ma_HA%QA~<%=-Khk3)HJ|6c)DUBhlBxu%F^+WkXMy@Z4%sznWN!UC(Y;qKZ3m zXnk2vhFoPv&rY@uws^GMet7O&_F&5w5uAMP1XKReztJ~@1Hyw^O~KiJzXDV2<# z*xB7hR;^_9)Z@KJN6)aMRdRaz(a~LjKcCB|&rIrcJWjX`fHe^8Qj%8EH#RbQcGL3v*#PkhJ z%dwoUEYon!QY11zFj>G05eapGU&z(rLNwe+ZShG84_7bIsE>1eltJhBxiU-)g3i|6 zT1iI0mQl)P1(_3M9tlaeJx}_|6Smo+HYtB$`UcRBIk1DU7I^+*H#a_G!fBc5p~S8V zgE`AL=!<|lK5i?1UQAfSZ@YM6iCti;NcegE4X<7n&$L8IW?Gt;Yfn{3v}%VNmsyXL z_DGz+Bat?vG!inYJHDOA*EJw2oYkHI3`Ldrz8=500N6J?6S$^j#R()G%sw z9`jFpo_kK2$PB}BIxg3Y7O9R6%FCfO=+rGIpv*CCCbF0mUm9itW|GAeom_iNpwH9B zI4xN&R5-u>SYAj<#!FWqN$rMdPEumXfEFq2V>$1hTfQeI7WQy2&V^(~^q+}~BO=Ti z;YlqHYBK+rb}igZ_R`Fv=!?7J)A0Ic6|~Q01X&OS{}L$d3KF76Oc(b>www!i5~%oU zAbF#Cbhv-;FkBg<*x7w{(A*=1Fujb{i9D{@4Pkaun4OE3u0K&A6*|qfscag~=-Om!})2o uAT6Y&l|S!^b>iwoGwkUa{?JyqR>-9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/consumer_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/consumer_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4885dae2d665f88deef97580d4c919bd2e109a84 GIT binary patch literal 3233 zcmcguPgC1Q6qjUM*uwu1!I*>qAtb?VzzL*jI!!wrz+`AsV1RTcJDt(U-nAn~mfV$` z0Z(r9&0a_!Ivcx9a*>j2HSgM_;8l9wBrqJBE41NAwriF_XDZpHj7U>j~ z8PZc!2V}4Y+Vn+AaIVoAXmL)7&O(cG%2a_C=giUT&>~JNC8!&8p5DC35S``P(@Z~? z!Nyek8eO1^xIVn8_6%L3x4?oKx=e2a=1MEHMy4x>0aAA^iY>V%VFS(z%?j!+y+>Cs zilihEEA*on;>Yy9KwP71fV%?zub<29Sz3iCge`_GYMP$qdA@_)W z0#XX#{s-h%0xe~F3)dXl{TO0`c9&V1mD+Q3X-+b(Go6)zegO0h;OoXbE3rcRCS7% zP1ibn)J*5$76deKA`W~vR>@p>J`jc$Eoy?Yjn_)Bv+0t?L1 z3Lvdf<~6w0^<565i4OBTvjxh5##z&54c~Gd7!|y;PTjQ)YWil~^jLo`^l{9Ub>U@S z3#Zn>OQH(aX8)Czhe)hn&TQqjqW~OYXbxpkizZvHZ91)Wm$#}d<_P^*K*fR{<8Q16 zgAg{Y*5_lR-cOJ_?cc4_W7aKyp-sW+ZSWF4UB-QjdHSlR!J^TqEH5QiCpWIeEMJdg z&z67tRo2qOk)G9(j@ekGMBsZGsibi109lPnYPtu)Ns34WFE=Ic-=Y~ z^Sr-wSvsS*jR=eliAScA;yI}HAZ0m}od&AY>(m+NMdXRRkT7fm+~`EaZGf9Ahyq8V zpbc;f4St8tngP*DCWOs2d$w(0wu5xjvYDWgNCoN})9x`ZC_r)grsY^p%fLbi*Dl6f z^n8>1K|aP|4h`Nf$o~Ae>*M80V#V6O_aRB#ol#W}CebZCM0P7h;S!&N0iVK7$8H)r zl5TXn!uTL%n{{TBsaK|FP}Veiwr>bWgWUKq8yz5_T82U3L-%hYVAk>scIq?7gM`Dq zJR}XTfu>=4_zma=73`YOjhTnP6JnktTA(&9W>YWFMmQeHI?VH-rZD6y+vGVw9EU`;~~a?o{0$d%U8^-V`U672qE=T zJ-@m3M1=NgVKjP>2jM{)HR9(%fAK2x*nu&yK&3w$lZsz36(!JiYRB70dxs|nM}cM- z9hdfOW*C*bLBc!pg6tc{F)N1UG~GZk>ZA~1LD~3jz1QUE2APEX4=)Uk6%?e6DCZoj z3Ir}M4xU9$(RkXaD;YR=q6=Nfd_b@WJslx?@Q;!YN6IpcQ^{?1d@^*M@pb4 Qs;psC@?f);7=07}0Esb$CjbBd literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/context_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/context_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16c9e8d750b8c45861830a7c3175bee238c6a70f GIT binary patch literal 2606 zcmcgtPjA~c6c=S%w&lNZ)BI`OH0#tu!KWYq<3>RpvBpw`ZtE^;;bf@YOem9$Q7kelaC+)^Ifl!5VE$5X7=PSSL+d9Ng$5dXu)uhvcJkeUig%z}%wk zIi@|wEYC3;3bP?GGAh<>f?jEzkEb#n4yHM1dyoX`k$?H^!pHN_yww1T4t|A3pi?Hn zs`>kiop>1SL|(M*j69!g581;9Z){3-+%R-~YDXU5?uEl)7;Hx@j6*&%?0{vb7X~ps zjjhOe*p1Fa>9KDQ9b!Kz$Z6rzm;ucNRyrsYD-(pb+5na^k;~8zgyGw<7d!xl1`T>4 zp&i5|_XS%f9V?&n831h(%6rU<;*deFIHa80E({hXqkW(DVlND!*WhPEC-g01$F^g0 zI$lebm|aO%t#NE7mM*Lj8%p(P6vEVI9YWDv7@t;mlL#Ej&>SMXKeM@^ZwGESWbTej z1LYwTP&Ff`?8NI)2w~rIKfTcV{TDs|{PV*Xqczw=^Gcen49z%LiFBcJj$ zw3*wgJY3BX?#?hrV863xRx;gI(=2f+!xb_ZiMGnEC9}-vn-S$PC2Kl3D@zcp=ENhQ z$w|%A;C~K^Gux0(LF5B_NJTNSd#_=`g~88)*gh342&QNI-k1_AjO6ZfT+8SpN2IYD zw-%e3#zrL3OVdLpL2Bx%xK8ECnpR{ZllWPu$!hQy<^IU`Eybze1%#doBNz=G%0xas zizqJjqR5hxDEPKReZ2I8%`HOv_Q;Q|6WbqAQM=f!&XQRT!(|Ho5)Tc?o7naOFK`oE z)#DZ%MH+BeFBIfdw0JL!D1&=L6ZyX9)9IEZ{w*{!-fTtMO425|vkmC7TT*BAJ?axK z%(*v?tAR=fHL0|ujJTQt*HRk9c6`bj;08D6!z~7o2=)&CFf3%$vg$Xq7<^K)HJPsl|x+IOEM7`rO6@= zu0MmE*jsq+%7NxWfg8_cf@BmWYxm{B@%}f*!XQxE2*uS@bM*C>`?#KDl;xbMbHduv z0uXH;P!JGP-a6-I+Rtn7y4f%75`Wst>UaB^2F=KY)MYgNIlJL z>>g+#M6=?MxnI=1DDM`y%aYA_B5xr68#E=ffvU-yD;4rcSFeGpMk<3w&m#kskZkkF m)ZqbLf=r}R{xZ6*(8;KD?8V+YJ>{y%l&@X~CT4E_&;0{!1MQ&z literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/control_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/control_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92d9800f3465b28189d1947ac5e2c0fcca54dbb3 GIT binary patch literal 1990 zcmcgs&2HO95a#NKqNrcXwjw8vQxrKw2TMqDDbOHjW5+>?);1iU76k~BJ7THuue+3C z3Aw3PzeI0+fnE#rG4@oTC%-~Zoh2oUZqaMG*x~HV?Cdu)yYsTuGFyMNzyHF>Nk2+Jfq|%}mx{O(?O}k|1p_3G3WcX$N&()@56aKnG`ay2W~I z8@=zaT^u{CkJb;CWZGi`+>?*K`lJ2cP1hryrUpv-teJ5S*(0`p)1}+64V~!@>%P*U zHQj~Ik|3t~w9mRwn?9Hj7{E4r%noi!%QD?Vn}@KcY?N>75hEY8;gegHveVl#QWq1I zed@2~5l&G-@<~Hea{3DrNv^pv&d6WijMFd~Cw_A1%=~~IhWy3zA8lY`FOIzc?8Fy` zZXAYjbeQlsjm1haM$Oobqm;*il{ha($y^$*0y}h={kp1-#i?-}$vsph6lADOWIkzA z3}vapD4j|@uv0&JjtF&#+?c_TaD{z?mMh1Z&$|=Q+GHSH?k8!?aa9XJ2;0NW(&R7+ zz)k%)!c|AiLkGb!JGC8Kz+#YxSd3(p#keqY%?M+pdM0`~i}7f)jj0%Ily90xc?Ql^ zYR(CLyV7}aU`O64=HA$YDDzNAXm+9ie&xG>DV+G;m-kk`|6HoP`}+L->^F7hf5Pk) zV19mJ)>c@0+hzlzE1$`jk-C^iseLVb z7_)B&{sNd4C#pz-whFSuk?W8ay-m(Xt1x9T$i>0G4Mv3|+^WZLTSsytwMBK7P7c2q zc6kd0vObvwft6vb`VoU`sYkQW0WK@)JOOIBNn$BZRs-9CfNuR@3yZUzWvO$mSJrl?uy`Cb2A84(+U5Wsk_2O}MHeZD0Y`kDjYmA`NSmbl%7fHjke- zvv{n3GyqyV&WlKEN@X#Jwofpf#~aU2)kbq8pq&$y+l@f#44*K=TVfrZonBs?eM@(X z#TS+{&+ZoOUx4Rh4fy>d=>9v1fZJG{tckdB@Lk@(F4dK*troJvd^hD=3QuS4X{|HX z@2AiyvktGiBzEOI$*)x}6_-d1azL8-C>zxZDP=<^O?}Oyq*Ng~F-RL}g_tG$P?lTf PoKZGW-p0LV*)0DJB41LA literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/distribution_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/distribution_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25620727ba0c2ff9fa97e0e5f9e352fff536898c GIT binary patch literal 6416 zcmd5<&3D_z5eN7IQQ(ItI+myp%ip%>Sd=Ztj+3~utq;qp6-klhHr=KV59BUs&>+A7 zpd;bsROPBaqlaF4>pzfxp|2O5`d&^t<(^Y#79a^&qD1-7SK?tgyO^2%&CKrX?1OAp z&i*I&-QN}k;TIwFy9D$zcE=^q=*tjKuctZ(HJx;Tnnx>cN%we94aRis?l@Nlf^cqKi^8*5)PoDicy)nq_9O+GZ z3vkBHL>fPa^fsO4NXI$S61@{a`sqMO@6x$}k(TNFMQD40 zHg2*4mmY51qHAoZal0n6S%$sQZf}hKiIT(EL7b02?v5kZy7bD{f-SLU; z_!LloK1_oCX`sG4OdP~X39#K^C60|#jZZ`L-7wvli}cEo-aPhjoh$dK_*y9ahF1*))y0mSsAo9ekLFFY{Eh9ZRdU9nCb9R%M~w+V@gVbhTNb>S7Y- zhF7rQIE+Gz!2pLQ1M#EK0DBJ5me{5z>8hg{_W`EFjH*dlNwm;_9%Ks@bDiB8fLo@_ zu3B2lF)io~HJNRzbrAMsi`8^iMTpQFvGclfM469B*m{w?!;qN8R&H znf&>maXA}RwkGFv&0wmf_&RMamtL3~3`}{03%?W!-^dr(UduF?;b^Mf)rLMyFDwkG zZMCNXRKAk)pivq0gboC1X$V*w_s zz$&B|g7~bsG%ODV3uNhkxY;Vf1}{lo!cd#c8)~W5caT^-$=){{b6Py4`$Ef??GMcThJ%<@KWK%NIB^A4BwwN`F024J$XJDYZccy{r z-Vq)Z+Ep-9TY@Gq(i%fWDO7}pS~JkK@cQLRHI3=i_T=u=Hpv*wb|5?m8NYPk+Z+$c zb}&=5qBAQGY6xt#zzBsWGn+`Tna!F_@}bz;j%qn17aD;ud%@0f@AivcBiX9)NHV7fv{#a%hK$O(QR z(d09zUqd*`k?ckMtmS@wesDb9X+NQV{)PVOCOr3?Nt^`f(S0~D2%cEWepc1~jSzlC z2+=dpy*ZFR^1(srem0O;IeNSvrD3xjVG&49IxpQX22;v<2W963!yOzwEZs)~D~lYm zUgz9#=LS;{oC2jJ&&NDfS>s?LPf*r1ptM!YXTPEIBc+!+-e(5SugLlz8oc%)yijw4 zdhhtjf@K`(TfVvX`b=K#SMYg$q1PW3Pn}0ty^{}$Joi?=$%0}oaN-eO9Z0mo>%T$+ zS-%iG8UoRy4QSk{&}89K8ms+M%#&AEUoY>hZ|`pHc(S52P1@F(qCfy|g0wY@O$nQa z*gS%!l&}g&--(Xi_u}@x?PcCG3(r4AGis(6Qz~R60KhB#O1owagCI%6soS};Shxwi zloFh@7H$k+=-pkc436ZL5AH8yXvIId$q;^0XoZAoe=CbZ*ZtWQYB~y(8~%Uj&Vz0s zxfgJluJrJrtwin(kdYU7vi1hNWKB0!hg?ur)?e@LtS`OUUEkVNcAjspt&(fe!KF9L zuU2=rwvpqtva!Co`h17nK8`Y=Nsh48H^k2%j>&jWD5`I9zHU4iWtd8 zKJu+ea(?ZgRQ7rKWKE+Ba{jsB9mM_XNoor#I+737Kb((T43|oFM~aN?usYlanHBXi znOR!t*N{KUK#((0ecqX0@WBidsDV9lgdN3ACh?1CsM-mgzhI?`he!$^N z`c$f`sV9pvAIkoJX!*e3i}j>}v!C&Cl|FI3zb8UO$Q literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/documentation_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/documentation_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..648dc288a345bc52057d6adcc2712753a5d43900 GIT binary patch literal 3906 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/httpbody_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/httpbody_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b04c29a5553a7bb65e5a2dbfa9e3c2a89334b399 GIT binary patch literal 2397 zcmcgt&2QT_6c;61wiWraah;^ClYVSVFvLdN%YYWenr8jLurz3MScw6GWYVf!S<*hO7`=3K#5kTrl;!*$>lM-8$;Oj4yPsm&44I?(#4=_1m&&~Xza zTBJ!@1kon+;^+#wLN-B1n_Pv~CLP$bHAkaOvOPy6Z5{as`JIbKvf~=L4w5%WH^1XE zvb$stBvo>g+ydHh0gI&Nbh?_W$OillsV1Y_&x<;C`G`c=S^agE{FUeOI>RiKJklCeODI>kN_6T~d9PBS-nobrP z&;cYT`Q%^rC(wBT$Oi>P(a9e`1UhF@I3fRj-;c*pKk}kOXX5$faLn%A{n@6Z?}nl4 zQ#9y`Q-RFrn1D@+Hn=9UVK z#4Q5`ACwWqGM90vCqnn_*bDB0i#iPkA)yC|N#|GYGO0Mxd1(Qp4MO>Vc~KlPn3cwq zbK8Z@!eDgh(?RTo0nF-rI(9C^N*_Blqdl^h(4W!xLCq#OA7#H%u zEh<2s3T0ND#KXgH4jQZm3{e?QeBVmkE_z`9T`*2OG6T3gh@vDHqUhTW^>Op9 z%`HNQ_Qa2^_qIQwqPjjcmt~%8!xakpQVn(KltDB2Sz;VO+==Q>;MQDckVm#|9$$Y(1Ilbj@Tt5v2ciE% zdV!xox6T!^-NQ?R?g0Q?xjecIQdGztCZ&Hk$g+|dmv@hMP}NxvSw-p yq$W*Ax@s1)8SvBs(oq@JfEM7N&dO^u$txg3g%9LYJ?W^d)sO)zHPCHnhV~y2tHEUe literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/label_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/label_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a811d0147d6908fd2d93db2c8126e51553660da9 GIT binary patch literal 2762 zcmcIlOK;mo5av=MMXmLU{I(Ovah!+RSVoezXwe{O96PB2*D)M7KoRAH*D|n;7kfu?MB2Ob4(>jQ1iyGBmYkY-fX!a*9T&ITo5*@TmFVoEu14)Y< z@FvMA-U8ktdBx{}$7Bj=Y^qZ@(MXXQof5@#iWZnoizf(Z=>*a8sX@xHR-qMog(4>T zE3^upAsQIdr-qWu&{-I1$sC=BF_N@1id&$Ibm=rts;t?kX!Q zbotITy3BH&l@?;x**v{RH%|4F3|R%88*EkTNF??eMK85leJG2+Kg<^7Zl!{+U$CyflG;b0T%E>Kf7zJ|IBGwS=Xb1bS6ShO+U8KTGl+NG+du$hUf)XDa|!%k`MzvXT>~ zs$V3^%>eMYzU#MDF_Ud7DI`(s@K}^m66RBJu|Eb&mqQe?a|SDyE7W0qn1{fh32k8X z;?~CJwTgnk7eUIal1xi71B6)3FjT<`Lv=a1@`DrEl(n3m7uyP$D4v^=!sx$E%<>F! zn!vp#9TwckX2&t}Bd8nnB1^O8Bx=Om+R>)(7yY7}N&C64(tbAR^uOgWDgl zPW>OlJ79S(7xMm9!EhP6Fk3G3Xe97i&=D#4EQ+BoWv|GUG1y2UA;mFT>NGsY%ixAo z&dhBN=L?I78Tc${MSMl>cOA%JCKa;EyF8g|y1?5zFP|Rn9vrIaanpY1r;2hv|OIw!m>wI<5P*kiY-v+2f-#tM`D z&!Zz(pEI9v2db|wj%MI}lU!Kx>=n7uL}aPkjQOfeMR|;5yk?Ehv((L~?sIu7!Y!QC z_p!V?qhEnoXayCLk+F;{($z3g;f&YyEHXiAqVr!%PjoFEXU29QQQ8(NDSb=XBs7c0 cvt$kH^2v_8NJ|}AnF82hg!K~ah%-3zFXjdlY5)KL literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/log_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/log_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7819a1e489d72c4736482a2d631764aea44ec04c GIT binary patch literal 2585 zcmcgt&2HO95av=6B~iatY}t-~lO}1@z%r6t3N#3sKL-I^$4GKo6d*{=ilsu4>@F49 zLT<{{FVS0%eTAY=!Bc@=s#oZ#vrEaMf*NQq<$}ZA*_qjyZ)S%NYc;d>d;R-A>zek5 zmU*^t{w==ZH==2v0r54eF>OFV+tfgRukl^TLH?5#-GYMrQXQoXKR3+N0+AX;oEx;L z<|Uk$Xj#q6I5%m9Xsj}*PBdCWS<|l%8?=eM!e9j|P=y-Pp*|r<8%UdjmP?>{VbB&z zT!R&80b%kj3|8S9tfGxIXyaIeb=29Ikii;kP6(u9U4Bvi`bAS|Y{524?!YeWfez~~ z#;3;Ta{F)trS$(``6hgU^0)q-hMRXaIq>XtsHxd)xC38aG-(@SUT5vW25fC=)+TGS z*5Ep@OY+pxllgPlHMyQ~d&p>v^6a&!-6_Sv44kx^SWfV|Z@Url9t zPo_DfJxr>4|s~kUzNpqs`#Z z4MW#wcI1hJUN{_v!9m2sI25yuL)LkJV2d~F^VbJ&7ZG=!TYvxdGszl5k&HS>WzWE*6k+%326nFu>d ziw%80cenCjD-%`sSngz0ubGuO)`;mwPFYwrtKf;qx6dtQH!rzQ2md2P&MY+@BT=Cx z#mMfx#~MfsaUR6>S<*siJ=^!j46HDc1tDlH!;2hR1s1UYu<|@6l4Z=s8;ewTm(b+c zT($AeRoh*O$W-3KX&K2;qKylqxPS0QiPa)0Fe3b&--;pu0I5sZco<4Ha~j~FfW zqR5i7q@dD7SAMXC1*~t6{Mh&^QjuqIB&v+Bf(B`GO#qp*yL5(nAVPDW@rnW?E^O)8%94xbOD-+nPg?9ABeE#C? zvp26!-@Sg5n3gpRVdOK*>fB6n;#?%v4~)xPSzgc&6WwxXV`fHm7iZMxvdm}&D`egh zxk^OInpFjt$w7fdYvffGi}hK1q{ZiHmC>TyvcRF4cEf8@X;$|Zgt3J!Qhik+ShAtS;FvOjeDB?}n0G3%;z_d@@>^xyGLUby0Hk>tVa#k?gCXv{6m_e%42 zlKDxgAFKR9;SVv*;A2^z;uDe**(KF<Cnd3}Wcj!hD51Jx>f$B6XyB{H7~O e7pvvHbY<%Jpmu6Cot1KRViHrY<4I=D%>4~h(e{P_ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/logging_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/logging_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30445768ae7487178d86f178f3fdf150c386c839 GIT binary patch literal 3003 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 Z0xd2o*rX)rRs!(LsYsBI#CSj!{|k99fIa{K literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/monitored_resource_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/monitored_resource_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d954835767edf3769ba9dfa65529dc9f018e50 GIT binary patch literal 5335 zcmc&&TW{OQ6(*^RW$J3hadeC0I8I{4v7Fd(o6V+ad{NSDW5@8NKnDvDlxCz-p+uFW z7O}c-?n^Iu*uT)X{(+*;*?+-@qClVg7j}W7=L|`ivT9e}qNoWD&&-^2=9_QMoEdp7 znUs@%Pks5#BSH9w5cn&B{1RR(6%hm~P*E3%z=W1ag}gwe_kuY~Lp1zbp}RmM_$3l( zMfFfSOd=v$On@9E6I_mg93zulo&;GYaZzCLR^mh;Nzj$`R69*Fygv^8QzQ%hk=8Yu zph=oy5>20oP-dXaw5D0MHQkix)W;~92CeHfORrIpO~V^$&CqFj9emEv8}Q_49_$Jy zV(SJio`}?a^7sY)(#H(9xJhS0Gj|1xTXc@zhG+aS=II?O!85+a0=-M`!E>K3f?d7| ztH7TC`evjl-~;V>n&MKKKA=k>kU}*Ysx}rIQf34?2tN{y=Aapo10<2erI!!3rR~`4|G*GPf;r zTl7+HJs9|TIj}@O&jz*Pz)uOJFSws2?q_M>XQ}lNWn2#h_fMXeMJx}5^3P8(QSP3G zpsb51!ykU}-GbK&L-Dl$s^adSp>V_xCMxsdyQ3Am-CgNw-Q`+O)9G^CTz&j&mC==^ zVKjB7b~S6cZnWD*XSr({wqbc4E6}q7t(t9^j4CFxjGkF%O1HLJ=^i_==epXiQS}8R zY{7z8Fr!cm0hFMD1C&AdT4=!xPjE)kt`pT&TkAXquu;~j8$qJrbcL$6T2n1lnAFu8(-A&uTejJ& z+gR)0af!HKz7&Okld45_g7$ zlGn}w)q0H;mm;@!{?j+2TpXF&_Fyrx2|3(R+bkEE6Bj43W*>K1PUN*|IYBk6tEfk<*5-+=LY|5;8Efp z%R!GL#_kwawPTydg=IO;hjgpixEy-Vj=ec0<;Yj6-eWmFnP<{dasJ!ii*kO%;|{Y` z48v?iPFly7&Dx4LLnJ4@dc()#6JI&tv6=lsj`u8P`r0n~bzd6-v2x*9l_M|=KrcL& z)90H0(`+`6|BshP#?Cc0|4B(Nb)(D7EFgBm4NYfe5yY`4 zj&Onfz>e>)jmcTi=oF6+CzvDptK+)y@)Ar7Pa4c8{pB%jUG-Buj85ZN;Nf-J!s2@< zyoED!AUiQ62iMu0gQ|H8+oBDP>C|%M0i6~}bQo-W%2~%Ae@QIPF-iLCK-C(MJq2z^ zW?-(Ea9l8pM2!wJ8Wza}!rZb|(PTIk10e zQVNby;St-1Y^i+-8$$aX6wYW0?|X+49=D?#vVZ$hj2M3Yq5kh3RJ=9*C$87|#Mpmw znRh>%pU<%Ur$59BIqX0CL6)3I?Jn#Q?H5ou7au(Rg>eRe>=`_qF5hYc7KUs{@Vx3j z8fVl>;Dpou2*EJ4wr&3^HFWzdOOCuGz-;ouiZP1?16r~(8mvJ9H!D1Z> zXjmO?s5l|O>?FQoCMG>a>og2UQfega!SzpJ6O%THL#p-fno{W?}S%z z!c?o<<~1ZW?R)b2O!%Lc;Ktt?N*H($E#BoM@VkcpG{buV{DyKP_XQp{)?Xm}W8$os zaGy{t1X3t0O8kk6Q7IGgYtSZz#i$q)Q&5KCd(|51hecU}Kk(&_;YzXac%%5XQ4b+{ zi4E{xgz#)!80CLDt~-*?%q8Q7ki!JLDJW(4ky0=#IV4LdF2%yUCMM3;L$EI5zW`mC B^`!s+ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/monitoring_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/monitoring_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0a52f311f9b39b8846ee37ab81d2e83af7b089c GIT binary patch literal 3090 zcmcguPjA~c6c=S%wiW-2TiZ#Rrb*MTb=xFp3k(BR6lgBZNLr#_6^o=q0@k!eBE)UJyLS4q;7#;CP7b+i|{_GcxyL2}}aRglu$%pi+%NND7N z*Kl6)1>g&~DET7rI$l5uUFes_3NC}J?p6j>T!Xn>e~~PZ5-C%aRK^Hs6=t809$Yrq6AWgU%qy;)lW7Kbuw&}*f=H4#whOfo<% zBzU;QTRhL;;aMQ>6%a+8Ux7sEm1tw=gGnjtn9$76Z*{YY$NDC*bYvj!Xwulbcy*mCp^QWFb&ALzyQT@ zU^+1Gl|E!M7MZA>NOR55@$N&A8ucun&^BTs{8_+E7?w8AJb<)LD7TmsKrk@M4=CrR z4a$+uXwRiq==dIts{CZo^<9IQq1iRL5U84-=ZE0c_qa%6bR|ywLVnva`H>zkZbR}| zlT#0e3Yod?o(gtlHI-E=<2bGBAAUo+K8v{igWiC+$k3w9fXc!r zi3_xZ)-$&k9^6Z1x;;}%vAZ)RVGI)C!@)&k>X#c^+0`2}hiNY>dVLU=oDzdk?hlzo zAzpO5Sg-1Uh>$rJUlKlxPv8Fk->aLzrL9F-&m7PwADGq~0BNN06E8H6qdI(N$8?<$ zB;W@Ukhq+h3%a;OXh1yzTf?C|nqP_0-5Cs1UnIq*%7*6@ZS?pH3~YZ~^oeLZlOm88 zkuu5+!`{|6?Ha4VL{#hzUDuHL=Nw4nIMTe~pi5bl4Nn4!3sw*qf{Svl*`+RC{K@11 z!JavEL*t$44rx?AKP)AiU8>We}Fh&Ln)HfSyPxV2=gL+wgy9XRm^EUhq{DE`dL66 zmps@&fCCY?SeYipWt6x)&4id;m$Dj|!L>7WgF%0x9BaNu{T|1)6o`0evJh8NGk~Wk zwf9GjxhdoM4dGK@o7+7m3lQf-G<`h3BYeu*-1af~9t@3^Q_&_+OirV=8tJ>wUq5@b ze|YrrRiqon06LmW4Wpf5b5p~6%LQFc VMx=w~idunq3RxBD86A}}{{be|pK<^I literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/quota_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/quota_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6c1779dd61874f3b47d5155df190a1836cb2c67 GIT binary patch literal 5344 zcmcgvOLN=E5eE1GNrnZM zKm(vlLhVht>X1WzKvKEnZ}^ZOfm5n-;$PTPx(6T#>SZ~HB?^O{neLviAJa2@l*`Gv z|K$I;`$!P}D@1;`fc_3%`%_X7s6a(sAOaIwA{C|t8hbBTH)xzD{vvel&?J6I47emc z-cFFDh!QEFC6eNF8t631a5@9DOh!b3jkL1I0?7fdtmoUKqyS^d))*b3S(;-pnm-ny z9fh{gDmF!0IFU#ZIIht#TBIVwH`yAe*XTIth|vi;32mtfX!%pZ7P!hM1D88oOL{QApUw$EqdHSpW(;JWJuemp-IF42NB!c59{T6UM`+}(ahJMF! zTs@A@=?fmkOX3K~#_1Yehgi>C7H`hCL08CK@>R6v)M z>#W4eF#C{?RM-@ZOtA`#?DCNbR&3p%V^0N;L~04B3a3_q%C&B?;;{(TDASsyV=UFW z)ezYno1pLL?@waKadI1Y?y%b-&r-;P60>2i)R$mop#E?Y2idz^7U~4(M=f_-P%VPB zRzpeD^L5yp3iVWg`hn}2=hE|`p83`S(zp+lMQBUBox*lsSR_3x?mN9Wv~>|__~94d zHF)g=G(QT!D(?IX8c#g5keN3>eZTCqJIfudvsCM9I$dg8D-S=Yj4n4#v#B$+quEP! zv)wk0rH*AfrX5Ty!_4xBuIZ>sr?yh<9C_)dy4tQ$^%oiopQKBm?oI z&;p~5(TLcNC+VuA84m%U#EiO0*`jD6@&Q&06?2{83cxK>X4fsPM# z*Z_YJ ztRCa~=A)|*K7iwp79*kf_-)8AsU z9~Y2BE0FL%V!G z6vyQ()$ES09x2?GENZGO$s@aH#0VW!n&dAVi zbg!SW&(AY|v-a>1=wTV{tz+|dXaaMs381|+s>J-Uu0z+F!7-_!F`e3;9D=Y()?l^+ zK|%9zrf-PNk&#>bMFn9j* zY}_r{Eciv+hQ^E3-XU)cfbbpYR?b(A`Psv}gcmK;7nu~PM>^g>B1d!8k9jYRn)!Kh zkq7at@q#nvB4s>iu+yWb%22XJQASRlUKW z&yy9UZBp2~in18D?t!eeip>*fU|@N8;Jz2Pk8Cgdky%(670qavUQDTx(O@ZlovL*k z7Vcv*0_C`W8?>;vdub&o!4?*LU>MvAEd)*q%BhD%{uB;pi1&O3k z(@`KM{x@=)#Oox|WVY$nC!~XR-(Z6TxjAPWK;FU%G#PZ-pIWEWYoJuEnPt2a~$054n{{SEXv$OyJ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/service_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/service_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4493d613084d8bd88ddddcd5f97645ba847c2db GIT binary patch literal 8136 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 NMF!!yNj*}}e*np$k0k&A literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api/__pycache__/source_info_pb2.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api/__pycache__/source_info_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb12c044d7e3873fb1776053d35dd9618b12f96e GIT binary patch literal 2186 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\n\x0e\x62ucket_options\x18\x06 \x01(\x0b\x32&.google.api.Distribution.BucketOptions\x12\x15\n\rbucket_counts\x18\x07 \x03(\x03\x1a!\n\x05Range\x12\x0b\n\x03min\x18\x01 \x01(\x01\x12\x0b\n\x03max\x18\x02 \x01(\x01\x1a\xb5\x03\n\rBucketOptions\x12G\n\x0elinear_buckets\x18\x01 \x01(\x0b\x32-.google.api.Distribution.BucketOptions.LinearH\x00\x12Q\n\x13\x65xponential_buckets\x18\x02 \x01(\x0b\x32\x32.google.api.Distribution.BucketOptions.ExponentialH\x00\x12K\n\x10\x65xplicit_buckets\x18\x03 \x01(\x0b\x32/.google.api.Distribution.BucketOptions.ExplicitH\x00\x1a\x43\n\x06Linear\x12\x1a\n\x12num_finite_buckets\x18\x01 \x01(\x05\x12\r\n\x05width\x18\x02 \x01(\x01\x12\x0e\n\x06offset\x18\x03 \x01(\x01\x1aO\n\x0b\x45xponential\x12\x1a\n\x12num_finite_buckets\x18\x01 \x01(\x05\x12\x15\n\rgrowth_factor\x18\x02 \x01(\x01\x12\r\n\x05scale\x18\x03 \x01(\x01\x1a\x1a\n\x08\x45xplicit\x12\x0e\n\x06\x62ounds\x18\x01 \x03(\x01\x42\t\n\x07optionsBj\n\x0e\x63om.google.apiB\x11\x44istributionProtoP\x01ZCgoogle.golang.org/genproto/googleapis/api/distribution;distributionb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + + +_DISTRIBUTION_RANGE = _descriptor.Descriptor( + name='Range', + full_name='google.api.Distribution.Range', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='min', full_name='google.api.Distribution.Range.min', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='max', full_name='google.api.Distribution.Range.max', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=289, + serialized_end=322, +) + +_DISTRIBUTION_BUCKETOPTIONS_LINEAR = _descriptor.Descriptor( + name='Linear', + full_name='google.api.Distribution.BucketOptions.Linear', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num_finite_buckets', full_name='google.api.Distribution.BucketOptions.Linear.num_finite_buckets', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='width', full_name='google.api.Distribution.BucketOptions.Linear.width', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='offset', full_name='google.api.Distribution.BucketOptions.Linear.offset', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=575, + serialized_end=642, +) + +_DISTRIBUTION_BUCKETOPTIONS_EXPONENTIAL = _descriptor.Descriptor( + name='Exponential', + full_name='google.api.Distribution.BucketOptions.Exponential', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='num_finite_buckets', full_name='google.api.Distribution.BucketOptions.Exponential.num_finite_buckets', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='growth_factor', full_name='google.api.Distribution.BucketOptions.Exponential.growth_factor', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='scale', full_name='google.api.Distribution.BucketOptions.Exponential.scale', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=644, + serialized_end=723, +) + +_DISTRIBUTION_BUCKETOPTIONS_EXPLICIT = _descriptor.Descriptor( + name='Explicit', + full_name='google.api.Distribution.BucketOptions.Explicit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bounds', full_name='google.api.Distribution.BucketOptions.Explicit.bounds', index=0, + number=1, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=725, + serialized_end=751, +) + +_DISTRIBUTION_BUCKETOPTIONS = _descriptor.Descriptor( + name='BucketOptions', + full_name='google.api.Distribution.BucketOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='linear_buckets', full_name='google.api.Distribution.BucketOptions.linear_buckets', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='exponential_buckets', full_name='google.api.Distribution.BucketOptions.exponential_buckets', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='explicit_buckets', full_name='google.api.Distribution.BucketOptions.explicit_buckets', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_DISTRIBUTION_BUCKETOPTIONS_LINEAR, _DISTRIBUTION_BUCKETOPTIONS_EXPONENTIAL, _DISTRIBUTION_BUCKETOPTIONS_EXPLICIT, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='options', full_name='google.api.Distribution.BucketOptions.options', + index=0, containing_type=None, fields=[]), + ], + serialized_start=325, + serialized_end=762, +) + +_DISTRIBUTION = _descriptor.Descriptor( + name='Distribution', + full_name='google.api.Distribution', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='count', full_name='google.api.Distribution.count', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mean', full_name='google.api.Distribution.mean', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='sum_of_squared_deviation', full_name='google.api.Distribution.sum_of_squared_deviation', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='range', full_name='google.api.Distribution.range', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='bucket_options', full_name='google.api.Distribution.bucket_options', index=4, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='bucket_counts', full_name='google.api.Distribution.bucket_counts', index=5, + number=7, type=3, cpp_type=2, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_DISTRIBUTION_RANGE, _DISTRIBUTION_BUCKETOPTIONS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=76, + serialized_end=762, +) + +_DISTRIBUTION_RANGE.containing_type = _DISTRIBUTION +_DISTRIBUTION_BUCKETOPTIONS_LINEAR.containing_type = _DISTRIBUTION_BUCKETOPTIONS +_DISTRIBUTION_BUCKETOPTIONS_EXPONENTIAL.containing_type = _DISTRIBUTION_BUCKETOPTIONS +_DISTRIBUTION_BUCKETOPTIONS_EXPLICIT.containing_type = _DISTRIBUTION_BUCKETOPTIONS +_DISTRIBUTION_BUCKETOPTIONS.fields_by_name['linear_buckets'].message_type = _DISTRIBUTION_BUCKETOPTIONS_LINEAR +_DISTRIBUTION_BUCKETOPTIONS.fields_by_name['exponential_buckets'].message_type = _DISTRIBUTION_BUCKETOPTIONS_EXPONENTIAL +_DISTRIBUTION_BUCKETOPTIONS.fields_by_name['explicit_buckets'].message_type = _DISTRIBUTION_BUCKETOPTIONS_EXPLICIT +_DISTRIBUTION_BUCKETOPTIONS.containing_type = _DISTRIBUTION +_DISTRIBUTION_BUCKETOPTIONS.oneofs_by_name['options'].fields.append( + _DISTRIBUTION_BUCKETOPTIONS.fields_by_name['linear_buckets']) +_DISTRIBUTION_BUCKETOPTIONS.fields_by_name['linear_buckets'].containing_oneof = _DISTRIBUTION_BUCKETOPTIONS.oneofs_by_name['options'] +_DISTRIBUTION_BUCKETOPTIONS.oneofs_by_name['options'].fields.append( + _DISTRIBUTION_BUCKETOPTIONS.fields_by_name['exponential_buckets']) +_DISTRIBUTION_BUCKETOPTIONS.fields_by_name['exponential_buckets'].containing_oneof = _DISTRIBUTION_BUCKETOPTIONS.oneofs_by_name['options'] +_DISTRIBUTION_BUCKETOPTIONS.oneofs_by_name['options'].fields.append( + _DISTRIBUTION_BUCKETOPTIONS.fields_by_name['explicit_buckets']) +_DISTRIBUTION_BUCKETOPTIONS.fields_by_name['explicit_buckets'].containing_oneof = _DISTRIBUTION_BUCKETOPTIONS.oneofs_by_name['options'] +_DISTRIBUTION.fields_by_name['range'].message_type = _DISTRIBUTION_RANGE +_DISTRIBUTION.fields_by_name['bucket_options'].message_type = _DISTRIBUTION_BUCKETOPTIONS +DESCRIPTOR.message_types_by_name['Distribution'] = _DISTRIBUTION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Distribution = _reflection.GeneratedProtocolMessageType('Distribution', (_message.Message,), dict( + + Range = _reflection.GeneratedProtocolMessageType('Range', (_message.Message,), dict( + DESCRIPTOR = _DISTRIBUTION_RANGE, + __module__ = 'google.api.distribution_pb2' + # @@protoc_insertion_point(class_scope:google.api.Distribution.Range) + )) + , + + BucketOptions = _reflection.GeneratedProtocolMessageType('BucketOptions', (_message.Message,), dict( + + Linear = _reflection.GeneratedProtocolMessageType('Linear', (_message.Message,), dict( + DESCRIPTOR = _DISTRIBUTION_BUCKETOPTIONS_LINEAR, + __module__ = 'google.api.distribution_pb2' + # @@protoc_insertion_point(class_scope:google.api.Distribution.BucketOptions.Linear) + )) + , + + Exponential = _reflection.GeneratedProtocolMessageType('Exponential', (_message.Message,), dict( + DESCRIPTOR = _DISTRIBUTION_BUCKETOPTIONS_EXPONENTIAL, + __module__ = 'google.api.distribution_pb2' + # @@protoc_insertion_point(class_scope:google.api.Distribution.BucketOptions.Exponential) + )) + , + + Explicit = _reflection.GeneratedProtocolMessageType('Explicit', (_message.Message,), dict( + DESCRIPTOR = _DISTRIBUTION_BUCKETOPTIONS_EXPLICIT, + __module__ = 'google.api.distribution_pb2' + # @@protoc_insertion_point(class_scope:google.api.Distribution.BucketOptions.Explicit) + )) + , + DESCRIPTOR = _DISTRIBUTION_BUCKETOPTIONS, + __module__ = 'google.api.distribution_pb2' + # @@protoc_insertion_point(class_scope:google.api.Distribution.BucketOptions) + )) + , + DESCRIPTOR = _DISTRIBUTION, + __module__ = 'google.api.distribution_pb2' + # @@protoc_insertion_point(class_scope:google.api.Distribution) + )) +_sym_db.RegisterMessage(Distribution) +_sym_db.RegisterMessage(Distribution.Range) +_sym_db.RegisterMessage(Distribution.BucketOptions) +_sym_db.RegisterMessage(Distribution.BucketOptions.Linear) +_sym_db.RegisterMessage(Distribution.BucketOptions.Exponential) +_sym_db.RegisterMessage(Distribution.BucketOptions.Explicit) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/documentation_pb2.py b/venv/lib/python3.6/site-packages/google/api/documentation_pb2.py new file mode 100644 index 0000000..35c4bf7 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/documentation_pb2.py @@ -0,0 +1,207 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/documentation.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/documentation.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\022DocumentationProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x1egoogle/api/documentation.proto\x12\ngoogle.api\"\xa1\x01\n\rDocumentation\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12\x1f\n\x05pages\x18\x05 \x03(\x0b\x32\x10.google.api.Page\x12,\n\x05rules\x18\x03 \x03(\x0b\x32\x1d.google.api.DocumentationRule\x12\x1e\n\x16\x64ocumentation_root_url\x18\x04 \x01(\t\x12\x10\n\x08overview\x18\x02 \x01(\t\"[\n\x11\x44ocumentationRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1f\n\x17\x64\x65precation_description\x18\x03 \x01(\t\"I\n\x04Page\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\"\n\x08subpages\x18\x03 \x03(\x0b\x32\x10.google.api.PageBt\n\x0e\x63om.google.apiB\x12\x44ocumentationProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') +) + + + + +_DOCUMENTATION = _descriptor.Descriptor( + name='Documentation', + full_name='google.api.Documentation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='summary', full_name='google.api.Documentation.summary', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='pages', full_name='google.api.Documentation.pages', index=1, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rules', full_name='google.api.Documentation.rules', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='documentation_root_url', full_name='google.api.Documentation.documentation_root_url', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='overview', full_name='google.api.Documentation.overview', index=4, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=47, + serialized_end=208, +) + + +_DOCUMENTATIONRULE = _descriptor.Descriptor( + name='DocumentationRule', + full_name='google.api.DocumentationRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='selector', full_name='google.api.DocumentationRule.selector', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='description', full_name='google.api.DocumentationRule.description', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='deprecation_description', full_name='google.api.DocumentationRule.deprecation_description', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=210, + serialized_end=301, +) + + +_PAGE = _descriptor.Descriptor( + name='Page', + full_name='google.api.Page', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.Page.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='content', full_name='google.api.Page.content', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='subpages', full_name='google.api.Page.subpages', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=303, + serialized_end=376, +) + +_DOCUMENTATION.fields_by_name['pages'].message_type = _PAGE +_DOCUMENTATION.fields_by_name['rules'].message_type = _DOCUMENTATIONRULE +_PAGE.fields_by_name['subpages'].message_type = _PAGE +DESCRIPTOR.message_types_by_name['Documentation'] = _DOCUMENTATION +DESCRIPTOR.message_types_by_name['DocumentationRule'] = _DOCUMENTATIONRULE +DESCRIPTOR.message_types_by_name['Page'] = _PAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Documentation = _reflection.GeneratedProtocolMessageType('Documentation', (_message.Message,), dict( + DESCRIPTOR = _DOCUMENTATION, + __module__ = 'google.api.documentation_pb2' + # @@protoc_insertion_point(class_scope:google.api.Documentation) + )) +_sym_db.RegisterMessage(Documentation) + +DocumentationRule = _reflection.GeneratedProtocolMessageType('DocumentationRule', (_message.Message,), dict( + DESCRIPTOR = _DOCUMENTATIONRULE, + __module__ = 'google.api.documentation_pb2' + # @@protoc_insertion_point(class_scope:google.api.DocumentationRule) + )) +_sym_db.RegisterMessage(DocumentationRule) + +Page = _reflection.GeneratedProtocolMessageType('Page', (_message.Message,), dict( + DESCRIPTOR = _PAGE, + __module__ = 'google.api.documentation_pb2' + # @@protoc_insertion_point(class_scope:google.api.Page) + )) +_sym_db.RegisterMessage(Page) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/endpoint_pb2.py b/venv/lib/python3.6/site-packages/google/api/endpoint_pb2.py new file mode 100644 index 0000000..5bfc5b7 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/endpoint_pb2.py @@ -0,0 +1,100 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/endpoint.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/endpoint.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\rEndpointProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x19google/api/endpoint.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\"_\n\x08\x45ndpoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x61liases\x18\x02 \x03(\t\x12\x10\n\x08\x66\x65\x61tures\x18\x04 \x03(\t\x12\x0e\n\x06target\x18\x65 \x01(\t\x12\x12\n\nallow_cors\x18\x05 \x01(\x08\x42o\n\x0e\x63om.google.apiB\rEndpointProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + + +_ENDPOINT = _descriptor.Descriptor( + name='Endpoint', + full_name='google.api.Endpoint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.Endpoint.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='aliases', full_name='google.api.Endpoint.aliases', index=1, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='features', full_name='google.api.Endpoint.features', index=2, + number=4, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='target', full_name='google.api.Endpoint.target', index=3, + number=101, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='allow_cors', full_name='google.api.Endpoint.allow_cors', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=71, + serialized_end=166, +) + +DESCRIPTOR.message_types_by_name['Endpoint'] = _ENDPOINT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Endpoint = _reflection.GeneratedProtocolMessageType('Endpoint', (_message.Message,), dict( + DESCRIPTOR = _ENDPOINT, + __module__ = 'google.api.endpoint_pb2' + # @@protoc_insertion_point(class_scope:google.api.Endpoint) + )) +_sym_db.RegisterMessage(Endpoint) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/http_pb2.py b/venv/lib/python3.6/site-packages/google/api/http_pb2.py new file mode 100644 index 0000000..104dfd4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/http_pb2.py @@ -0,0 +1,249 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/http.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/http.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\tHttpProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\370\001\001\242\002\004GAPI'), + serialized_pb=_b('\n\x15google/api/http.proto\x12\ngoogle.api\"T\n\x04Http\x12#\n\x05rules\x18\x01 \x03(\x0b\x32\x14.google.api.HttpRule\x12\'\n\x1f\x66ully_decode_reserved_expansion\x18\x02 \x01(\x08\"\x81\x02\n\x08HttpRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\r\n\x03get\x18\x02 \x01(\tH\x00\x12\r\n\x03put\x18\x03 \x01(\tH\x00\x12\x0e\n\x04post\x18\x04 \x01(\tH\x00\x12\x10\n\x06\x64\x65lete\x18\x05 \x01(\tH\x00\x12\x0f\n\x05patch\x18\x06 \x01(\tH\x00\x12/\n\x06\x63ustom\x18\x08 \x01(\x0b\x32\x1d.google.api.CustomHttpPatternH\x00\x12\x0c\n\x04\x62ody\x18\x07 \x01(\t\x12\x15\n\rresponse_body\x18\x0c \x01(\t\x12\x31\n\x13\x61\x64\x64itional_bindings\x18\x0b \x03(\x0b\x32\x14.google.api.HttpRuleB\t\n\x07pattern\"/\n\x11\x43ustomHttpPattern\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\tBj\n\x0e\x63om.google.apiB\tHttpProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3') +) + + + + +_HTTP = _descriptor.Descriptor( + name='Http', + full_name='google.api.Http', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rules', full_name='google.api.Http.rules', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='fully_decode_reserved_expansion', full_name='google.api.Http.fully_decode_reserved_expansion', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=37, + serialized_end=121, +) + + +_HTTPRULE = _descriptor.Descriptor( + name='HttpRule', + full_name='google.api.HttpRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='selector', full_name='google.api.HttpRule.selector', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='get', full_name='google.api.HttpRule.get', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='put', full_name='google.api.HttpRule.put', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='post', full_name='google.api.HttpRule.post', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='delete', full_name='google.api.HttpRule.delete', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='patch', full_name='google.api.HttpRule.patch', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='custom', full_name='google.api.HttpRule.custom', index=6, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='body', full_name='google.api.HttpRule.body', index=7, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='response_body', full_name='google.api.HttpRule.response_body', index=8, + number=12, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='additional_bindings', full_name='google.api.HttpRule.additional_bindings', index=9, + number=11, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='pattern', full_name='google.api.HttpRule.pattern', + index=0, containing_type=None, fields=[]), + ], + serialized_start=124, + serialized_end=381, +) + + +_CUSTOMHTTPPATTERN = _descriptor.Descriptor( + name='CustomHttpPattern', + full_name='google.api.CustomHttpPattern', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='kind', full_name='google.api.CustomHttpPattern.kind', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='path', full_name='google.api.CustomHttpPattern.path', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=383, + serialized_end=430, +) + +_HTTP.fields_by_name['rules'].message_type = _HTTPRULE +_HTTPRULE.fields_by_name['custom'].message_type = _CUSTOMHTTPPATTERN +_HTTPRULE.fields_by_name['additional_bindings'].message_type = _HTTPRULE +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['get']) +_HTTPRULE.fields_by_name['get'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['put']) +_HTTPRULE.fields_by_name['put'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['post']) +_HTTPRULE.fields_by_name['post'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['delete']) +_HTTPRULE.fields_by_name['delete'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['patch']) +_HTTPRULE.fields_by_name['patch'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['custom']) +_HTTPRULE.fields_by_name['custom'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +DESCRIPTOR.message_types_by_name['Http'] = _HTTP +DESCRIPTOR.message_types_by_name['HttpRule'] = _HTTPRULE +DESCRIPTOR.message_types_by_name['CustomHttpPattern'] = _CUSTOMHTTPPATTERN +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Http = _reflection.GeneratedProtocolMessageType('Http', (_message.Message,), dict( + DESCRIPTOR = _HTTP, + __module__ = 'google.api.http_pb2' + # @@protoc_insertion_point(class_scope:google.api.Http) + )) +_sym_db.RegisterMessage(Http) + +HttpRule = _reflection.GeneratedProtocolMessageType('HttpRule', (_message.Message,), dict( + DESCRIPTOR = _HTTPRULE, + __module__ = 'google.api.http_pb2' + # @@protoc_insertion_point(class_scope:google.api.HttpRule) + )) +_sym_db.RegisterMessage(HttpRule) + +CustomHttpPattern = _reflection.GeneratedProtocolMessageType('CustomHttpPattern', (_message.Message,), dict( + DESCRIPTOR = _CUSTOMHTTPPATTERN, + __module__ = 'google.api.http_pb2' + # @@protoc_insertion_point(class_scope:google.api.CustomHttpPattern) + )) +_sym_db.RegisterMessage(CustomHttpPattern) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/httpbody_pb2.py b/venv/lib/python3.6/site-packages/google/api/httpbody_pb2.py new file mode 100644 index 0000000..9b5aab2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/httpbody_pb2.py @@ -0,0 +1,87 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/httpbody.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/httpbody.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\rHttpBodyProtoP\001Z;google.golang.org/genproto/googleapis/api/httpbody;httpbody\242\002\004GAPI'), + serialized_pb=_b('\n\x19google/api/httpbody.proto\x12\ngoogle.api\x1a\x19google/protobuf/any.proto\"X\n\x08HttpBody\x12\x14\n\x0c\x63ontent_type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12(\n\nextensions\x18\x03 \x03(\x0b\x32\x14.google.protobuf.AnyBe\n\x0e\x63om.google.apiB\rHttpBodyProtoP\x01Z;google.golang.org/genproto/googleapis/api/httpbody;httpbody\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,]) + + + + +_HTTPBODY = _descriptor.Descriptor( + name='HttpBody', + full_name='google.api.HttpBody', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='content_type', full_name='google.api.HttpBody.content_type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='google.api.HttpBody.data', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='extensions', full_name='google.api.HttpBody.extensions', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=68, + serialized_end=156, +) + +_HTTPBODY.fields_by_name['extensions'].message_type = google_dot_protobuf_dot_any__pb2._ANY +DESCRIPTOR.message_types_by_name['HttpBody'] = _HTTPBODY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HttpBody = _reflection.GeneratedProtocolMessageType('HttpBody', (_message.Message,), dict( + DESCRIPTOR = _HTTPBODY, + __module__ = 'google.api.httpbody_pb2' + # @@protoc_insertion_point(class_scope:google.api.HttpBody) + )) +_sym_db.RegisterMessage(HttpBody) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/label_pb2.py b/venv/lib/python3.6/site-packages/google/api/label_pb2.py new file mode 100644 index 0000000..c38b456 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/label_pb2.py @@ -0,0 +1,113 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/label.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/label.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\nLabelProtoP\001Z5google.golang.org/genproto/googleapis/api/label;label\370\001\001\242\002\004GAPI'), + serialized_pb=_b('\n\x16google/api/label.proto\x12\ngoogle.api\"\x9c\x01\n\x0fLabelDescriptor\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x39\n\nvalue_type\x18\x02 \x01(\x0e\x32%.google.api.LabelDescriptor.ValueType\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\",\n\tValueType\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x42OOL\x10\x01\x12\t\n\x05INT64\x10\x02\x42_\n\x0e\x63om.google.apiB\nLabelProtoP\x01Z5google.golang.org/genproto/googleapis/api/label;label\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3') +) + + + +_LABELDESCRIPTOR_VALUETYPE = _descriptor.EnumDescriptor( + name='ValueType', + full_name='google.api.LabelDescriptor.ValueType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STRING', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BOOL', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INT64', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=151, + serialized_end=195, +) +_sym_db.RegisterEnumDescriptor(_LABELDESCRIPTOR_VALUETYPE) + + +_LABELDESCRIPTOR = _descriptor.Descriptor( + name='LabelDescriptor', + full_name='google.api.LabelDescriptor', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='google.api.LabelDescriptor.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value_type', full_name='google.api.LabelDescriptor.value_type', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='description', full_name='google.api.LabelDescriptor.description', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LABELDESCRIPTOR_VALUETYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=39, + serialized_end=195, +) + +_LABELDESCRIPTOR.fields_by_name['value_type'].enum_type = _LABELDESCRIPTOR_VALUETYPE +_LABELDESCRIPTOR_VALUETYPE.containing_type = _LABELDESCRIPTOR +DESCRIPTOR.message_types_by_name['LabelDescriptor'] = _LABELDESCRIPTOR +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +LabelDescriptor = _reflection.GeneratedProtocolMessageType('LabelDescriptor', (_message.Message,), dict( + DESCRIPTOR = _LABELDESCRIPTOR, + __module__ = 'google.api.label_pb2' + # @@protoc_insertion_point(class_scope:google.api.LabelDescriptor) + )) +_sym_db.RegisterMessage(LabelDescriptor) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/log_pb2.py b/venv/lib/python3.6/site-packages/google/api/log_pb2.py new file mode 100644 index 0000000..975000a --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/log_pb2.py @@ -0,0 +1,94 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/log.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import label_pb2 as google_dot_api_dot_label__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/log.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\010LogProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x14google/api/log.proto\x12\ngoogle.api\x1a\x16google/api/label.proto\"u\n\rLogDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12+\n\x06labels\x18\x02 \x03(\x0b\x32\x1b.google.api.LabelDescriptor\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x04 \x01(\tBj\n\x0e\x63om.google.apiB\x08LogProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_label__pb2.DESCRIPTOR,]) + + + + +_LOGDESCRIPTOR = _descriptor.Descriptor( + name='LogDescriptor', + full_name='google.api.LogDescriptor', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.LogDescriptor.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='labels', full_name='google.api.LogDescriptor.labels', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='description', full_name='google.api.LogDescriptor.description', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='display_name', full_name='google.api.LogDescriptor.display_name', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=60, + serialized_end=177, +) + +_LOGDESCRIPTOR.fields_by_name['labels'].message_type = google_dot_api_dot_label__pb2._LABELDESCRIPTOR +DESCRIPTOR.message_types_by_name['LogDescriptor'] = _LOGDESCRIPTOR +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +LogDescriptor = _reflection.GeneratedProtocolMessageType('LogDescriptor', (_message.Message,), dict( + DESCRIPTOR = _LOGDESCRIPTOR, + __module__ = 'google.api.log_pb2' + # @@protoc_insertion_point(class_scope:google.api.LogDescriptor) + )) +_sym_db.RegisterMessage(LogDescriptor) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/logging_pb2.py b/venv/lib/python3.6/site-packages/google/api/logging_pb2.py new file mode 100644 index 0000000..cf5018c --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/logging_pb2.py @@ -0,0 +1,127 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/logging.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/logging.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\014LoggingProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x18google/api/logging.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\"\xd7\x01\n\x07Logging\x12\x45\n\x15producer_destinations\x18\x01 \x03(\x0b\x32&.google.api.Logging.LoggingDestination\x12\x45\n\x15\x63onsumer_destinations\x18\x02 \x03(\x0b\x32&.google.api.Logging.LoggingDestination\x1a>\n\x12LoggingDestination\x12\x1a\n\x12monitored_resource\x18\x03 \x01(\t\x12\x0c\n\x04logs\x18\x01 \x03(\tBn\n\x0e\x63om.google.apiB\x0cLoggingProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + + +_LOGGING_LOGGINGDESTINATION = _descriptor.Descriptor( + name='LoggingDestination', + full_name='google.api.Logging.LoggingDestination', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='monitored_resource', full_name='google.api.Logging.LoggingDestination.monitored_resource', index=0, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='logs', full_name='google.api.Logging.LoggingDestination.logs', index=1, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=224, + serialized_end=286, +) + +_LOGGING = _descriptor.Descriptor( + name='Logging', + full_name='google.api.Logging', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='producer_destinations', full_name='google.api.Logging.producer_destinations', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='consumer_destinations', full_name='google.api.Logging.consumer_destinations', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_LOGGING_LOGGINGDESTINATION, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=71, + serialized_end=286, +) + +_LOGGING_LOGGINGDESTINATION.containing_type = _LOGGING +_LOGGING.fields_by_name['producer_destinations'].message_type = _LOGGING_LOGGINGDESTINATION +_LOGGING.fields_by_name['consumer_destinations'].message_type = _LOGGING_LOGGINGDESTINATION +DESCRIPTOR.message_types_by_name['Logging'] = _LOGGING +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Logging = _reflection.GeneratedProtocolMessageType('Logging', (_message.Message,), dict( + + LoggingDestination = _reflection.GeneratedProtocolMessageType('LoggingDestination', (_message.Message,), dict( + DESCRIPTOR = _LOGGING_LOGGINGDESTINATION, + __module__ = 'google.api.logging_pb2' + # @@protoc_insertion_point(class_scope:google.api.Logging.LoggingDestination) + )) + , + DESCRIPTOR = _LOGGING, + __module__ = 'google.api.logging_pb2' + # @@protoc_insertion_point(class_scope:google.api.Logging) + )) +_sym_db.RegisterMessage(Logging) +_sym_db.RegisterMessage(Logging.LoggingDestination) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/metric_pb2.py b/venv/lib/python3.6/site-packages/google/api/metric_pb2.py new file mode 100644 index 0000000..95fae50 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/metric_pb2.py @@ -0,0 +1,294 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/metric.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import label_pb2 as google_dot_api_dot_label__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/metric.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\013MetricProtoP\001Z7google.golang.org/genproto/googleapis/api/metric;metric\242\002\004GAPI'), + serialized_pb=_b('\n\x17google/api/metric.proto\x12\ngoogle.api\x1a\x16google/api/label.proto\"\xd2\x03\n\x10MetricDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x08 \x01(\t\x12+\n\x06labels\x18\x02 \x03(\x0b\x32\x1b.google.api.LabelDescriptor\x12<\n\x0bmetric_kind\x18\x03 \x01(\x0e\x32\'.google.api.MetricDescriptor.MetricKind\x12:\n\nvalue_type\x18\x04 \x01(\x0e\x32&.google.api.MetricDescriptor.ValueType\x12\x0c\n\x04unit\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x07 \x01(\t\"O\n\nMetricKind\x12\x1b\n\x17METRIC_KIND_UNSPECIFIED\x10\x00\x12\t\n\x05GAUGE\x10\x01\x12\t\n\x05\x44\x45LTA\x10\x02\x12\x0e\n\nCUMULATIVE\x10\x03\"q\n\tValueType\x12\x1a\n\x16VALUE_TYPE_UNSPECIFIED\x10\x00\x12\x08\n\x04\x42OOL\x10\x01\x12\t\n\x05INT64\x10\x02\x12\n\n\x06\x44OUBLE\x10\x03\x12\n\n\x06STRING\x10\x04\x12\x10\n\x0c\x44ISTRIBUTION\x10\x05\x12\t\n\x05MONEY\x10\x06\"u\n\x06Metric\x12\x0c\n\x04type\x18\x03 \x01(\t\x12.\n\x06labels\x18\x02 \x03(\x0b\x32\x1e.google.api.Metric.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42_\n\x0e\x63om.google.apiB\x0bMetricProtoP\x01Z7google.golang.org/genproto/googleapis/api/metric;metric\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_label__pb2.DESCRIPTOR,]) + + + +_METRICDESCRIPTOR_METRICKIND = _descriptor.EnumDescriptor( + name='MetricKind', + full_name='google.api.MetricDescriptor.MetricKind', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='METRIC_KIND_UNSPECIFIED', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='GAUGE', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DELTA', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CUMULATIVE', index=3, number=3, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=336, + serialized_end=415, +) +_sym_db.RegisterEnumDescriptor(_METRICDESCRIPTOR_METRICKIND) + +_METRICDESCRIPTOR_VALUETYPE = _descriptor.EnumDescriptor( + name='ValueType', + full_name='google.api.MetricDescriptor.ValueType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALUE_TYPE_UNSPECIFIED', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BOOL', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INT64', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DOUBLE', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STRING', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DISTRIBUTION', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MONEY', index=6, number=6, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=417, + serialized_end=530, +) +_sym_db.RegisterEnumDescriptor(_METRICDESCRIPTOR_VALUETYPE) + + +_METRICDESCRIPTOR = _descriptor.Descriptor( + name='MetricDescriptor', + full_name='google.api.MetricDescriptor', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.MetricDescriptor.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='google.api.MetricDescriptor.type', index=1, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='labels', full_name='google.api.MetricDescriptor.labels', index=2, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metric_kind', full_name='google.api.MetricDescriptor.metric_kind', index=3, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value_type', full_name='google.api.MetricDescriptor.value_type', index=4, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unit', full_name='google.api.MetricDescriptor.unit', index=5, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='description', full_name='google.api.MetricDescriptor.description', index=6, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='display_name', full_name='google.api.MetricDescriptor.display_name', index=7, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _METRICDESCRIPTOR_METRICKIND, + _METRICDESCRIPTOR_VALUETYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=64, + serialized_end=530, +) + + +_METRIC_LABELSENTRY = _descriptor.Descriptor( + name='LabelsEntry', + full_name='google.api.Metric.LabelsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='google.api.Metric.LabelsEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='google.api.Metric.LabelsEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=604, + serialized_end=649, +) + +_METRIC = _descriptor.Descriptor( + name='Metric', + full_name='google.api.Metric', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='type', full_name='google.api.Metric.type', index=0, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='labels', full_name='google.api.Metric.labels', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_METRIC_LABELSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=532, + serialized_end=649, +) + +_METRICDESCRIPTOR.fields_by_name['labels'].message_type = google_dot_api_dot_label__pb2._LABELDESCRIPTOR +_METRICDESCRIPTOR.fields_by_name['metric_kind'].enum_type = _METRICDESCRIPTOR_METRICKIND +_METRICDESCRIPTOR.fields_by_name['value_type'].enum_type = _METRICDESCRIPTOR_VALUETYPE +_METRICDESCRIPTOR_METRICKIND.containing_type = _METRICDESCRIPTOR +_METRICDESCRIPTOR_VALUETYPE.containing_type = _METRICDESCRIPTOR +_METRIC_LABELSENTRY.containing_type = _METRIC +_METRIC.fields_by_name['labels'].message_type = _METRIC_LABELSENTRY +DESCRIPTOR.message_types_by_name['MetricDescriptor'] = _METRICDESCRIPTOR +DESCRIPTOR.message_types_by_name['Metric'] = _METRIC +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +MetricDescriptor = _reflection.GeneratedProtocolMessageType('MetricDescriptor', (_message.Message,), dict( + DESCRIPTOR = _METRICDESCRIPTOR, + __module__ = 'google.api.metric_pb2' + # @@protoc_insertion_point(class_scope:google.api.MetricDescriptor) + )) +_sym_db.RegisterMessage(MetricDescriptor) + +Metric = _reflection.GeneratedProtocolMessageType('Metric', (_message.Message,), dict( + + LabelsEntry = _reflection.GeneratedProtocolMessageType('LabelsEntry', (_message.Message,), dict( + DESCRIPTOR = _METRIC_LABELSENTRY, + __module__ = 'google.api.metric_pb2' + # @@protoc_insertion_point(class_scope:google.api.Metric.LabelsEntry) + )) + , + DESCRIPTOR = _METRIC, + __module__ = 'google.api.metric_pb2' + # @@protoc_insertion_point(class_scope:google.api.Metric) + )) +_sym_db.RegisterMessage(Metric) +_sym_db.RegisterMessage(Metric.LabelsEntry) + + +DESCRIPTOR._options = None +_METRIC_LABELSENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/monitored_resource_pb2.py b/venv/lib/python3.6/site-packages/google/api/monitored_resource_pb2.py new file mode 100644 index 0000000..cfcfb0b --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/monitored_resource_pb2.py @@ -0,0 +1,291 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/monitored_resource.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import label_pb2 as google_dot_api_dot_label__pb2 +from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/monitored_resource.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\026MonitoredResourceProtoP\001ZCgoogle.golang.org/genproto/googleapis/api/monitoredres;monitoredres\370\001\001\242\002\004GAPI'), + serialized_pb=_b('\n#google/api/monitored_resource.proto\x12\ngoogle.api\x1a\x16google/api/label.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x91\x01\n\x1bMonitoredResourceDescriptor\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12+\n\x06labels\x18\x04 \x03(\x0b\x32\x1b.google.api.LabelDescriptor\"\x8b\x01\n\x11MonitoredResource\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x39\n\x06labels\x18\x02 \x03(\x0b\x32).google.api.MonitoredResource.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xca\x01\n\x19MonitoredResourceMetadata\x12.\n\rsystem_labels\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12J\n\x0buser_labels\x18\x02 \x03(\x0b\x32\x35.google.api.MonitoredResourceMetadata.UserLabelsEntry\x1a\x31\n\x0fUserLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42y\n\x0e\x63om.google.apiB\x16MonitoredResourceProtoP\x01ZCgoogle.golang.org/genproto/googleapis/api/monitoredres;monitoredres\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_label__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,]) + + + + +_MONITOREDRESOURCEDESCRIPTOR = _descriptor.Descriptor( + name='MonitoredResourceDescriptor', + full_name='google.api.MonitoredResourceDescriptor', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.MonitoredResourceDescriptor.name', index=0, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='google.api.MonitoredResourceDescriptor.type', index=1, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='display_name', full_name='google.api.MonitoredResourceDescriptor.display_name', index=2, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='description', full_name='google.api.MonitoredResourceDescriptor.description', index=3, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='labels', full_name='google.api.MonitoredResourceDescriptor.labels', index=4, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=106, + serialized_end=251, +) + + +_MONITOREDRESOURCE_LABELSENTRY = _descriptor.Descriptor( + name='LabelsEntry', + full_name='google.api.MonitoredResource.LabelsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='google.api.MonitoredResource.LabelsEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='google.api.MonitoredResource.LabelsEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=348, + serialized_end=393, +) + +_MONITOREDRESOURCE = _descriptor.Descriptor( + name='MonitoredResource', + full_name='google.api.MonitoredResource', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='type', full_name='google.api.MonitoredResource.type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='labels', full_name='google.api.MonitoredResource.labels', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MONITOREDRESOURCE_LABELSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=254, + serialized_end=393, +) + + +_MONITOREDRESOURCEMETADATA_USERLABELSENTRY = _descriptor.Descriptor( + name='UserLabelsEntry', + full_name='google.api.MonitoredResourceMetadata.UserLabelsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='google.api.MonitoredResourceMetadata.UserLabelsEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='google.api.MonitoredResourceMetadata.UserLabelsEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=549, + serialized_end=598, +) + +_MONITOREDRESOURCEMETADATA = _descriptor.Descriptor( + name='MonitoredResourceMetadata', + full_name='google.api.MonitoredResourceMetadata', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='system_labels', full_name='google.api.MonitoredResourceMetadata.system_labels', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='user_labels', full_name='google.api.MonitoredResourceMetadata.user_labels', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MONITOREDRESOURCEMETADATA_USERLABELSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=396, + serialized_end=598, +) + +_MONITOREDRESOURCEDESCRIPTOR.fields_by_name['labels'].message_type = google_dot_api_dot_label__pb2._LABELDESCRIPTOR +_MONITOREDRESOURCE_LABELSENTRY.containing_type = _MONITOREDRESOURCE +_MONITOREDRESOURCE.fields_by_name['labels'].message_type = _MONITOREDRESOURCE_LABELSENTRY +_MONITOREDRESOURCEMETADATA_USERLABELSENTRY.containing_type = _MONITOREDRESOURCEMETADATA +_MONITOREDRESOURCEMETADATA.fields_by_name['system_labels'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT +_MONITOREDRESOURCEMETADATA.fields_by_name['user_labels'].message_type = _MONITOREDRESOURCEMETADATA_USERLABELSENTRY +DESCRIPTOR.message_types_by_name['MonitoredResourceDescriptor'] = _MONITOREDRESOURCEDESCRIPTOR +DESCRIPTOR.message_types_by_name['MonitoredResource'] = _MONITOREDRESOURCE +DESCRIPTOR.message_types_by_name['MonitoredResourceMetadata'] = _MONITOREDRESOURCEMETADATA +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +MonitoredResourceDescriptor = _reflection.GeneratedProtocolMessageType('MonitoredResourceDescriptor', (_message.Message,), dict( + DESCRIPTOR = _MONITOREDRESOURCEDESCRIPTOR, + __module__ = 'google.api.monitored_resource_pb2' + # @@protoc_insertion_point(class_scope:google.api.MonitoredResourceDescriptor) + )) +_sym_db.RegisterMessage(MonitoredResourceDescriptor) + +MonitoredResource = _reflection.GeneratedProtocolMessageType('MonitoredResource', (_message.Message,), dict( + + LabelsEntry = _reflection.GeneratedProtocolMessageType('LabelsEntry', (_message.Message,), dict( + DESCRIPTOR = _MONITOREDRESOURCE_LABELSENTRY, + __module__ = 'google.api.monitored_resource_pb2' + # @@protoc_insertion_point(class_scope:google.api.MonitoredResource.LabelsEntry) + )) + , + DESCRIPTOR = _MONITOREDRESOURCE, + __module__ = 'google.api.monitored_resource_pb2' + # @@protoc_insertion_point(class_scope:google.api.MonitoredResource) + )) +_sym_db.RegisterMessage(MonitoredResource) +_sym_db.RegisterMessage(MonitoredResource.LabelsEntry) + +MonitoredResourceMetadata = _reflection.GeneratedProtocolMessageType('MonitoredResourceMetadata', (_message.Message,), dict( + + UserLabelsEntry = _reflection.GeneratedProtocolMessageType('UserLabelsEntry', (_message.Message,), dict( + DESCRIPTOR = _MONITOREDRESOURCEMETADATA_USERLABELSENTRY, + __module__ = 'google.api.monitored_resource_pb2' + # @@protoc_insertion_point(class_scope:google.api.MonitoredResourceMetadata.UserLabelsEntry) + )) + , + DESCRIPTOR = _MONITOREDRESOURCEMETADATA, + __module__ = 'google.api.monitored_resource_pb2' + # @@protoc_insertion_point(class_scope:google.api.MonitoredResourceMetadata) + )) +_sym_db.RegisterMessage(MonitoredResourceMetadata) +_sym_db.RegisterMessage(MonitoredResourceMetadata.UserLabelsEntry) + + +DESCRIPTOR._options = None +_MONITOREDRESOURCE_LABELSENTRY._options = None +_MONITOREDRESOURCEMETADATA_USERLABELSENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/monitoring_pb2.py b/venv/lib/python3.6/site-packages/google/api/monitoring_pb2.py new file mode 100644 index 0000000..2b0745b --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/monitoring_pb2.py @@ -0,0 +1,127 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/monitoring.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/monitoring.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\017MonitoringProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x1bgoogle/api/monitoring.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\"\xec\x01\n\nMonitoring\x12K\n\x15producer_destinations\x18\x01 \x03(\x0b\x32,.google.api.Monitoring.MonitoringDestination\x12K\n\x15\x63onsumer_destinations\x18\x02 \x03(\x0b\x32,.google.api.Monitoring.MonitoringDestination\x1a\x44\n\x15MonitoringDestination\x12\x1a\n\x12monitored_resource\x18\x01 \x01(\t\x12\x0f\n\x07metrics\x18\x02 \x03(\tBq\n\x0e\x63om.google.apiB\x0fMonitoringProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + + +_MONITORING_MONITORINGDESTINATION = _descriptor.Descriptor( + name='MonitoringDestination', + full_name='google.api.Monitoring.MonitoringDestination', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='monitored_resource', full_name='google.api.Monitoring.MonitoringDestination.monitored_resource', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metrics', full_name='google.api.Monitoring.MonitoringDestination.metrics', index=1, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=242, + serialized_end=310, +) + +_MONITORING = _descriptor.Descriptor( + name='Monitoring', + full_name='google.api.Monitoring', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='producer_destinations', full_name='google.api.Monitoring.producer_destinations', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='consumer_destinations', full_name='google.api.Monitoring.consumer_destinations', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_MONITORING_MONITORINGDESTINATION, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=74, + serialized_end=310, +) + +_MONITORING_MONITORINGDESTINATION.containing_type = _MONITORING +_MONITORING.fields_by_name['producer_destinations'].message_type = _MONITORING_MONITORINGDESTINATION +_MONITORING.fields_by_name['consumer_destinations'].message_type = _MONITORING_MONITORINGDESTINATION +DESCRIPTOR.message_types_by_name['Monitoring'] = _MONITORING +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Monitoring = _reflection.GeneratedProtocolMessageType('Monitoring', (_message.Message,), dict( + + MonitoringDestination = _reflection.GeneratedProtocolMessageType('MonitoringDestination', (_message.Message,), dict( + DESCRIPTOR = _MONITORING_MONITORINGDESTINATION, + __module__ = 'google.api.monitoring_pb2' + # @@protoc_insertion_point(class_scope:google.api.Monitoring.MonitoringDestination) + )) + , + DESCRIPTOR = _MONITORING, + __module__ = 'google.api.monitoring_pb2' + # @@protoc_insertion_point(class_scope:google.api.Monitoring) + )) +_sym_db.RegisterMessage(Monitoring) +_sym_db.RegisterMessage(Monitoring.MonitoringDestination) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/quota_pb2.py b/venv/lib/python3.6/site-packages/google/api/quota_pb2.py new file mode 100644 index 0000000..6b5929a --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/quota_pb2.py @@ -0,0 +1,325 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/quota.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/quota.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\nQuotaProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x16google/api/quota.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\"]\n\x05Quota\x12&\n\x06limits\x18\x03 \x03(\x0b\x32\x16.google.api.QuotaLimit\x12,\n\x0cmetric_rules\x18\x04 \x03(\x0b\x32\x16.google.api.MetricRule\"\x91\x01\n\nMetricRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12=\n\x0cmetric_costs\x18\x02 \x03(\x0b\x32\'.google.api.MetricRule.MetricCostsEntry\x1a\x32\n\x10MetricCostsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01\"\x95\x02\n\nQuotaLimit\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x15\n\rdefault_limit\x18\x03 \x01(\x03\x12\x11\n\tmax_limit\x18\x04 \x01(\x03\x12\x11\n\tfree_tier\x18\x07 \x01(\x03\x12\x10\n\x08\x64uration\x18\x05 \x01(\t\x12\x0e\n\x06metric\x18\x08 \x01(\t\x12\x0c\n\x04unit\x18\t \x01(\t\x12\x32\n\x06values\x18\n \x03(\x0b\x32\".google.api.QuotaLimit.ValuesEntry\x12\x14\n\x0c\x64isplay_name\x18\x0c \x01(\t\x1a-\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01\x42l\n\x0e\x63om.google.apiB\nQuotaProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + + +_QUOTA = _descriptor.Descriptor( + name='Quota', + full_name='google.api.Quota', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='limits', full_name='google.api.Quota.limits', index=0, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metric_rules', full_name='google.api.Quota.metric_rules', index=1, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=68, + serialized_end=161, +) + + +_METRICRULE_METRICCOSTSENTRY = _descriptor.Descriptor( + name='MetricCostsEntry', + full_name='google.api.MetricRule.MetricCostsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='google.api.MetricRule.MetricCostsEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='google.api.MetricRule.MetricCostsEntry.value', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=259, + serialized_end=309, +) + +_METRICRULE = _descriptor.Descriptor( + name='MetricRule', + full_name='google.api.MetricRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='selector', full_name='google.api.MetricRule.selector', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metric_costs', full_name='google.api.MetricRule.metric_costs', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_METRICRULE_METRICCOSTSENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=164, + serialized_end=309, +) + + +_QUOTALIMIT_VALUESENTRY = _descriptor.Descriptor( + name='ValuesEntry', + full_name='google.api.QuotaLimit.ValuesEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='google.api.QuotaLimit.ValuesEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='google.api.QuotaLimit.ValuesEntry.value', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=544, + serialized_end=589, +) + +_QUOTALIMIT = _descriptor.Descriptor( + name='QuotaLimit', + full_name='google.api.QuotaLimit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.QuotaLimit.name', index=0, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='description', full_name='google.api.QuotaLimit.description', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='default_limit', full_name='google.api.QuotaLimit.default_limit', index=2, + number=3, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='max_limit', full_name='google.api.QuotaLimit.max_limit', index=3, + number=4, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='free_tier', full_name='google.api.QuotaLimit.free_tier', index=4, + number=7, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='duration', full_name='google.api.QuotaLimit.duration', index=5, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metric', full_name='google.api.QuotaLimit.metric', index=6, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unit', full_name='google.api.QuotaLimit.unit', index=7, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='values', full_name='google.api.QuotaLimit.values', index=8, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='display_name', full_name='google.api.QuotaLimit.display_name', index=9, + number=12, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_QUOTALIMIT_VALUESENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=312, + serialized_end=589, +) + +_QUOTA.fields_by_name['limits'].message_type = _QUOTALIMIT +_QUOTA.fields_by_name['metric_rules'].message_type = _METRICRULE +_METRICRULE_METRICCOSTSENTRY.containing_type = _METRICRULE +_METRICRULE.fields_by_name['metric_costs'].message_type = _METRICRULE_METRICCOSTSENTRY +_QUOTALIMIT_VALUESENTRY.containing_type = _QUOTALIMIT +_QUOTALIMIT.fields_by_name['values'].message_type = _QUOTALIMIT_VALUESENTRY +DESCRIPTOR.message_types_by_name['Quota'] = _QUOTA +DESCRIPTOR.message_types_by_name['MetricRule'] = _METRICRULE +DESCRIPTOR.message_types_by_name['QuotaLimit'] = _QUOTALIMIT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Quota = _reflection.GeneratedProtocolMessageType('Quota', (_message.Message,), dict( + DESCRIPTOR = _QUOTA, + __module__ = 'google.api.quota_pb2' + # @@protoc_insertion_point(class_scope:google.api.Quota) + )) +_sym_db.RegisterMessage(Quota) + +MetricRule = _reflection.GeneratedProtocolMessageType('MetricRule', (_message.Message,), dict( + + MetricCostsEntry = _reflection.GeneratedProtocolMessageType('MetricCostsEntry', (_message.Message,), dict( + DESCRIPTOR = _METRICRULE_METRICCOSTSENTRY, + __module__ = 'google.api.quota_pb2' + # @@protoc_insertion_point(class_scope:google.api.MetricRule.MetricCostsEntry) + )) + , + DESCRIPTOR = _METRICRULE, + __module__ = 'google.api.quota_pb2' + # @@protoc_insertion_point(class_scope:google.api.MetricRule) + )) +_sym_db.RegisterMessage(MetricRule) +_sym_db.RegisterMessage(MetricRule.MetricCostsEntry) + +QuotaLimit = _reflection.GeneratedProtocolMessageType('QuotaLimit', (_message.Message,), dict( + + ValuesEntry = _reflection.GeneratedProtocolMessageType('ValuesEntry', (_message.Message,), dict( + DESCRIPTOR = _QUOTALIMIT_VALUESENTRY, + __module__ = 'google.api.quota_pb2' + # @@protoc_insertion_point(class_scope:google.api.QuotaLimit.ValuesEntry) + )) + , + DESCRIPTOR = _QUOTALIMIT, + __module__ = 'google.api.quota_pb2' + # @@protoc_insertion_point(class_scope:google.api.QuotaLimit) + )) +_sym_db.RegisterMessage(QuotaLimit) +_sym_db.RegisterMessage(QuotaLimit.ValuesEntry) + + +DESCRIPTOR._options = None +_METRICRULE_METRICCOSTSENTRY._options = None +_QUOTALIMIT_VALUESENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/service_pb2.py b/venv/lib/python3.6/site-packages/google/api/service_pb2.py new file mode 100644 index 0000000..d5783ef --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/service_pb2.py @@ -0,0 +1,281 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/service.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 +from google.api import auth_pb2 as google_dot_api_dot_auth__pb2 +from google.api import backend_pb2 as google_dot_api_dot_backend__pb2 +from google.api import billing_pb2 as google_dot_api_dot_billing__pb2 +from google.api import context_pb2 as google_dot_api_dot_context__pb2 +from google.api import control_pb2 as google_dot_api_dot_control__pb2 +from google.api import documentation_pb2 as google_dot_api_dot_documentation__pb2 +from google.api import endpoint_pb2 as google_dot_api_dot_endpoint__pb2 +from google.api import http_pb2 as google_dot_api_dot_http__pb2 +from google.api import log_pb2 as google_dot_api_dot_log__pb2 +from google.api import logging_pb2 as google_dot_api_dot_logging__pb2 +from google.api import metric_pb2 as google_dot_api_dot_metric__pb2 +from google.api import monitored_resource_pb2 as google_dot_api_dot_monitored__resource__pb2 +from google.api import monitoring_pb2 as google_dot_api_dot_monitoring__pb2 +from google.api import quota_pb2 as google_dot_api_dot_quota__pb2 +from google.api import source_info_pb2 as google_dot_api_dot_source__info__pb2 +from google.api import system_parameter_pb2 as google_dot_api_dot_system__parameter__pb2 +from google.api import usage_pb2 as google_dot_api_dot_usage__pb2 +from google.protobuf import api_pb2 as google_dot_protobuf_dot_api__pb2 +from google.protobuf import type_pb2 as google_dot_protobuf_dot_type__pb2 +from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/service.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\014ServiceProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x18google/api/service.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\x1a\x15google/api/auth.proto\x1a\x18google/api/backend.proto\x1a\x18google/api/billing.proto\x1a\x18google/api/context.proto\x1a\x18google/api/control.proto\x1a\x1egoogle/api/documentation.proto\x1a\x19google/api/endpoint.proto\x1a\x15google/api/http.proto\x1a\x14google/api/log.proto\x1a\x18google/api/logging.proto\x1a\x17google/api/metric.proto\x1a#google/api/monitored_resource.proto\x1a\x1bgoogle/api/monitoring.proto\x1a\x16google/api/quota.proto\x1a\x1cgoogle/api/source_info.proto\x1a!google/api/system_parameter.proto\x1a\x16google/api/usage.proto\x1a\x19google/protobuf/api.proto\x1a\x1agoogle/protobuf/type.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xdc\x07\n\x07Service\x12\x34\n\x0e\x63onfig_version\x18\x14 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18! \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x1b\n\x13producer_project_id\x18\x16 \x01(\t\x12\"\n\x04\x61pis\x18\x03 \x03(\x0b\x32\x14.google.protobuf.Api\x12$\n\x05types\x18\x04 \x03(\x0b\x32\x15.google.protobuf.Type\x12$\n\x05\x65nums\x18\x05 \x03(\x0b\x32\x15.google.protobuf.Enum\x12\x30\n\rdocumentation\x18\x06 \x01(\x0b\x32\x19.google.api.Documentation\x12$\n\x07\x62\x61\x63kend\x18\x08 \x01(\x0b\x32\x13.google.api.Backend\x12\x1e\n\x04http\x18\t \x01(\x0b\x32\x10.google.api.Http\x12 \n\x05quota\x18\n \x01(\x0b\x32\x11.google.api.Quota\x12\x32\n\x0e\x61uthentication\x18\x0b \x01(\x0b\x32\x1a.google.api.Authentication\x12$\n\x07\x63ontext\x18\x0c \x01(\x0b\x32\x13.google.api.Context\x12 \n\x05usage\x18\x0f \x01(\x0b\x32\x11.google.api.Usage\x12\'\n\tendpoints\x18\x12 \x03(\x0b\x32\x14.google.api.Endpoint\x12$\n\x07\x63ontrol\x18\x15 \x01(\x0b\x32\x13.google.api.Control\x12\'\n\x04logs\x18\x17 \x03(\x0b\x32\x19.google.api.LogDescriptor\x12-\n\x07metrics\x18\x18 \x03(\x0b\x32\x1c.google.api.MetricDescriptor\x12\x44\n\x13monitored_resources\x18\x19 \x03(\x0b\x32\'.google.api.MonitoredResourceDescriptor\x12$\n\x07\x62illing\x18\x1a \x01(\x0b\x32\x13.google.api.Billing\x12$\n\x07logging\x18\x1b \x01(\x0b\x32\x13.google.api.Logging\x12*\n\nmonitoring\x18\x1c \x01(\x0b\x32\x16.google.api.Monitoring\x12\x37\n\x11system_parameters\x18\x1d \x01(\x0b\x32\x1c.google.api.SystemParameters\x12+\n\x0bsource_info\x18% \x01(\x0b\x32\x16.google.api.SourceInfoJ\x04\x08\x65\x10\x66\x42n\n\x0e\x63om.google.apiB\x0cServiceProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_api_dot_auth__pb2.DESCRIPTOR,google_dot_api_dot_backend__pb2.DESCRIPTOR,google_dot_api_dot_billing__pb2.DESCRIPTOR,google_dot_api_dot_context__pb2.DESCRIPTOR,google_dot_api_dot_control__pb2.DESCRIPTOR,google_dot_api_dot_documentation__pb2.DESCRIPTOR,google_dot_api_dot_endpoint__pb2.DESCRIPTOR,google_dot_api_dot_http__pb2.DESCRIPTOR,google_dot_api_dot_log__pb2.DESCRIPTOR,google_dot_api_dot_logging__pb2.DESCRIPTOR,google_dot_api_dot_metric__pb2.DESCRIPTOR,google_dot_api_dot_monitored__resource__pb2.DESCRIPTOR,google_dot_api_dot_monitoring__pb2.DESCRIPTOR,google_dot_api_dot_quota__pb2.DESCRIPTOR,google_dot_api_dot_source__info__pb2.DESCRIPTOR,google_dot_api_dot_system__parameter__pb2.DESCRIPTOR,google_dot_api_dot_usage__pb2.DESCRIPTOR,google_dot_protobuf_dot_api__pb2.DESCRIPTOR,google_dot_protobuf_dot_type__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,]) + + + + +_SERVICE = _descriptor.Descriptor( + name='Service', + full_name='google.api.Service', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='config_version', full_name='google.api.Service.config_version', index=0, + number=20, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='google.api.Service.name', index=1, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='id', full_name='google.api.Service.id', index=2, + number=33, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='title', full_name='google.api.Service.title', index=3, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='producer_project_id', full_name='google.api.Service.producer_project_id', index=4, + number=22, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='apis', full_name='google.api.Service.apis', index=5, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='types', full_name='google.api.Service.types', index=6, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='enums', full_name='google.api.Service.enums', index=7, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='documentation', full_name='google.api.Service.documentation', index=8, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='backend', full_name='google.api.Service.backend', index=9, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='http', full_name='google.api.Service.http', index=10, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='quota', full_name='google.api.Service.quota', index=11, + number=10, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='authentication', full_name='google.api.Service.authentication', index=12, + number=11, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='context', full_name='google.api.Service.context', index=13, + number=12, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='usage', full_name='google.api.Service.usage', index=14, + number=15, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='endpoints', full_name='google.api.Service.endpoints', index=15, + number=18, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='control', full_name='google.api.Service.control', index=16, + number=21, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='logs', full_name='google.api.Service.logs', index=17, + number=23, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metrics', full_name='google.api.Service.metrics', index=18, + number=24, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='monitored_resources', full_name='google.api.Service.monitored_resources', index=19, + number=25, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='billing', full_name='google.api.Service.billing', index=20, + number=26, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='logging', full_name='google.api.Service.logging', index=21, + number=27, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='monitoring', full_name='google.api.Service.monitoring', index=22, + number=28, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='system_parameters', full_name='google.api.Service.system_parameters', index=23, + number=29, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='source_info', full_name='google.api.Service.source_info', index=24, + number=37, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=619, + serialized_end=1607, +) + +_SERVICE.fields_by_name['config_version'].message_type = google_dot_protobuf_dot_wrappers__pb2._UINT32VALUE +_SERVICE.fields_by_name['apis'].message_type = google_dot_protobuf_dot_api__pb2._API +_SERVICE.fields_by_name['types'].message_type = google_dot_protobuf_dot_type__pb2._TYPE +_SERVICE.fields_by_name['enums'].message_type = google_dot_protobuf_dot_type__pb2._ENUM +_SERVICE.fields_by_name['documentation'].message_type = google_dot_api_dot_documentation__pb2._DOCUMENTATION +_SERVICE.fields_by_name['backend'].message_type = google_dot_api_dot_backend__pb2._BACKEND +_SERVICE.fields_by_name['http'].message_type = google_dot_api_dot_http__pb2._HTTP +_SERVICE.fields_by_name['quota'].message_type = google_dot_api_dot_quota__pb2._QUOTA +_SERVICE.fields_by_name['authentication'].message_type = google_dot_api_dot_auth__pb2._AUTHENTICATION +_SERVICE.fields_by_name['context'].message_type = google_dot_api_dot_context__pb2._CONTEXT +_SERVICE.fields_by_name['usage'].message_type = google_dot_api_dot_usage__pb2._USAGE +_SERVICE.fields_by_name['endpoints'].message_type = google_dot_api_dot_endpoint__pb2._ENDPOINT +_SERVICE.fields_by_name['control'].message_type = google_dot_api_dot_control__pb2._CONTROL +_SERVICE.fields_by_name['logs'].message_type = google_dot_api_dot_log__pb2._LOGDESCRIPTOR +_SERVICE.fields_by_name['metrics'].message_type = google_dot_api_dot_metric__pb2._METRICDESCRIPTOR +_SERVICE.fields_by_name['monitored_resources'].message_type = google_dot_api_dot_monitored__resource__pb2._MONITOREDRESOURCEDESCRIPTOR +_SERVICE.fields_by_name['billing'].message_type = google_dot_api_dot_billing__pb2._BILLING +_SERVICE.fields_by_name['logging'].message_type = google_dot_api_dot_logging__pb2._LOGGING +_SERVICE.fields_by_name['monitoring'].message_type = google_dot_api_dot_monitoring__pb2._MONITORING +_SERVICE.fields_by_name['system_parameters'].message_type = google_dot_api_dot_system__parameter__pb2._SYSTEMPARAMETERS +_SERVICE.fields_by_name['source_info'].message_type = google_dot_api_dot_source__info__pb2._SOURCEINFO +DESCRIPTOR.message_types_by_name['Service'] = _SERVICE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Service = _reflection.GeneratedProtocolMessageType('Service', (_message.Message,), dict( + DESCRIPTOR = _SERVICE, + __module__ = 'google.api.service_pb2' + # @@protoc_insertion_point(class_scope:google.api.Service) + )) +_sym_db.RegisterMessage(Service) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/source_info_pb2.py b/venv/lib/python3.6/site-packages/google/api/source_info_pb2.py new file mode 100644 index 0000000..fae6147 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/source_info_pb2.py @@ -0,0 +1,73 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/source_info.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/source_info.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\017SourceInfoProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x1cgoogle/api/source_info.proto\x12\ngoogle.api\x1a\x19google/protobuf/any.proto\"8\n\nSourceInfo\x12*\n\x0csource_files\x18\x01 \x03(\x0b\x32\x14.google.protobuf.AnyBq\n\x0e\x63om.google.apiB\x0fSourceInfoProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,]) + + + + +_SOURCEINFO = _descriptor.Descriptor( + name='SourceInfo', + full_name='google.api.SourceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='source_files', full_name='google.api.SourceInfo.source_files', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=71, + serialized_end=127, +) + +_SOURCEINFO.fields_by_name['source_files'].message_type = google_dot_protobuf_dot_any__pb2._ANY +DESCRIPTOR.message_types_by_name['SourceInfo'] = _SOURCEINFO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +SourceInfo = _reflection.GeneratedProtocolMessageType('SourceInfo', (_message.Message,), dict( + DESCRIPTOR = _SOURCEINFO, + __module__ = 'google.api.source_info_pb2' + # @@protoc_insertion_point(class_scope:google.api.SourceInfo) + )) +_sym_db.RegisterMessage(SourceInfo) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/system_parameter_pb2.py b/venv/lib/python3.6/site-packages/google/api/system_parameter_pb2.py new file mode 100644 index 0000000..1eaf76c --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/system_parameter_pb2.py @@ -0,0 +1,171 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/system_parameter.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/system_parameter.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\024SystemParameterProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n!google/api/system_parameter.proto\x12\ngoogle.api\"B\n\x10SystemParameters\x12.\n\x05rules\x18\x01 \x03(\x0b\x32\x1f.google.api.SystemParameterRule\"X\n\x13SystemParameterRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12/\n\nparameters\x18\x02 \x03(\x0b\x32\x1b.google.api.SystemParameter\"Q\n\x0fSystemParameter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bhttp_header\x18\x02 \x01(\t\x12\x1b\n\x13url_query_parameter\x18\x03 \x01(\tBv\n\x0e\x63om.google.apiB\x14SystemParameterProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') +) + + + + +_SYSTEMPARAMETERS = _descriptor.Descriptor( + name='SystemParameters', + full_name='google.api.SystemParameters', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rules', full_name='google.api.SystemParameters.rules', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=49, + serialized_end=115, +) + + +_SYSTEMPARAMETERRULE = _descriptor.Descriptor( + name='SystemParameterRule', + full_name='google.api.SystemParameterRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='selector', full_name='google.api.SystemParameterRule.selector', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='parameters', full_name='google.api.SystemParameterRule.parameters', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=117, + serialized_end=205, +) + + +_SYSTEMPARAMETER = _descriptor.Descriptor( + name='SystemParameter', + full_name='google.api.SystemParameter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='google.api.SystemParameter.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='http_header', full_name='google.api.SystemParameter.http_header', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='url_query_parameter', full_name='google.api.SystemParameter.url_query_parameter', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=207, + serialized_end=288, +) + +_SYSTEMPARAMETERS.fields_by_name['rules'].message_type = _SYSTEMPARAMETERRULE +_SYSTEMPARAMETERRULE.fields_by_name['parameters'].message_type = _SYSTEMPARAMETER +DESCRIPTOR.message_types_by_name['SystemParameters'] = _SYSTEMPARAMETERS +DESCRIPTOR.message_types_by_name['SystemParameterRule'] = _SYSTEMPARAMETERRULE +DESCRIPTOR.message_types_by_name['SystemParameter'] = _SYSTEMPARAMETER +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +SystemParameters = _reflection.GeneratedProtocolMessageType('SystemParameters', (_message.Message,), dict( + DESCRIPTOR = _SYSTEMPARAMETERS, + __module__ = 'google.api.system_parameter_pb2' + # @@protoc_insertion_point(class_scope:google.api.SystemParameters) + )) +_sym_db.RegisterMessage(SystemParameters) + +SystemParameterRule = _reflection.GeneratedProtocolMessageType('SystemParameterRule', (_message.Message,), dict( + DESCRIPTOR = _SYSTEMPARAMETERRULE, + __module__ = 'google.api.system_parameter_pb2' + # @@protoc_insertion_point(class_scope:google.api.SystemParameterRule) + )) +_sym_db.RegisterMessage(SystemParameterRule) + +SystemParameter = _reflection.GeneratedProtocolMessageType('SystemParameter', (_message.Message,), dict( + DESCRIPTOR = _SYSTEMPARAMETER, + __module__ = 'google.api.system_parameter_pb2' + # @@protoc_insertion_point(class_scope:google.api.SystemParameter) + )) +_sym_db.RegisterMessage(SystemParameter) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api/usage_pb2.py b/venv/lib/python3.6/site-packages/google/api/usage_pb2.py new file mode 100644 index 0000000..94a7d80 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api/usage_pb2.py @@ -0,0 +1,140 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/usage.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/usage.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\nUsageProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI'), + serialized_pb=_b('\n\x16google/api/usage.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\"j\n\x05Usage\x12\x14\n\x0crequirements\x18\x01 \x03(\t\x12$\n\x05rules\x18\x06 \x03(\x0b\x32\x15.google.api.UsageRule\x12%\n\x1dproducer_notification_channel\x18\x07 \x01(\t\"]\n\tUsageRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12 \n\x18\x61llow_unregistered_calls\x18\x02 \x01(\x08\x12\x1c\n\x14skip_service_control\x18\x03 \x01(\x08\x42l\n\x0e\x63om.google.apiB\nUsageProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + + +_USAGE = _descriptor.Descriptor( + name='Usage', + full_name='google.api.Usage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='requirements', full_name='google.api.Usage.requirements', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rules', full_name='google.api.Usage.rules', index=1, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='producer_notification_channel', full_name='google.api.Usage.producer_notification_channel', index=2, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=68, + serialized_end=174, +) + + +_USAGERULE = _descriptor.Descriptor( + name='UsageRule', + full_name='google.api.UsageRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='selector', full_name='google.api.UsageRule.selector', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='allow_unregistered_calls', full_name='google.api.UsageRule.allow_unregistered_calls', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='skip_service_control', full_name='google.api.UsageRule.skip_service_control', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=176, + serialized_end=269, +) + +_USAGE.fields_by_name['rules'].message_type = _USAGERULE +DESCRIPTOR.message_types_by_name['Usage'] = _USAGE +DESCRIPTOR.message_types_by_name['UsageRule'] = _USAGERULE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Usage = _reflection.GeneratedProtocolMessageType('Usage', (_message.Message,), dict( + DESCRIPTOR = _USAGE, + __module__ = 'google.api.usage_pb2' + # @@protoc_insertion_point(class_scope:google.api.Usage) + )) +_sym_db.RegisterMessage(Usage) + +UsageRule = _reflection.GeneratedProtocolMessageType('UsageRule', (_message.Message,), dict( + DESCRIPTOR = _USAGERULE, + __module__ = 'google.api.usage_pb2' + # @@protoc_insertion_point(class_scope:google.api.UsageRule) + )) +_sym_db.RegisterMessage(UsageRule) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/venv/lib/python3.6/site-packages/google/api_core/__init__.py b/venv/lib/python3.6/site-packages/google/api_core/__init__.py new file mode 100644 index 0000000..c762e18 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Google API Core. + +This package contains common code and utilties used by Google client libraries. +""" + +from pkg_resources import get_distribution + + +__version__ = get_distribution("google-api-core").version diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04fc5498c6c0252cfcaaab6c3aa615283fb3b07d GIT binary patch literal 370 zcmZ9H&q@O^5XQ5AN@Z=e_yCe?58Fk(iYPruFCyrv2t#%=tg+c-O|n9J^=W*iJqezC z1y4>(4`LwSd|~+JH@O&(v(e|#({XyF{-O5o gg3z!<7XZqr05EIU{lR5pWvB7#gy#B`B#lSOFDZ&|?EnA( literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/bidi.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/bidi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01c4c6f4c5972c94b4f5949bd3b58a50ef58458f GIT binary patch literal 17487 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 CJW+E1 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/datetime_helpers.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/datetime_helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18ecbddf488bd78e0ed83cae2614cfafe7186417 GIT binary patch literal 7061 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 ZR5YWasit8T%t`#sm{t5uny**p{sXEFA$kA+ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/exceptions.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f97290c2d0272721efa10d599615902afebe428d GIT binary patch literal 15766 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/grpc_helpers.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/grpc_helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6741e286614c5d68dd798fdc07dc7be2fd505e08 GIT binary patch literal 11867 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 Mw)8>i!_xG>0r+mLQ~&?~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/protobuf_helpers.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/protobuf_helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9eb3c9dfcb07a1399bb6061f30462014c47f856 GIT binary patch literal 9044 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 Ag#Z8m literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/retry.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/retry.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9649541c5ba0431030c1e35a55c26e1da66fe82b GIT binary patch literal 9560 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/__pycache__/timeout.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/__pycache__/timeout.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..735e6643f191e774fe8992faf53b0cb3b25f7182 GIT binary patch literal 6907 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/bidi.py b/venv/lib/python3.6/site-packages/google/api_core/bidi.py new file mode 100644 index 0000000..795a8d2 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/bidi.py @@ -0,0 +1,600 @@ +# Copyright 2017, Google LLC +# +# 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 +# +# https://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. + +"""Bi-directional streaming RPC helpers.""" + +import logging +import threading + +from six.moves import queue + +from google.api_core import exceptions + +_LOGGER = logging.getLogger(__name__) +_BIDIRECTIONAL_CONSUMER_NAME = "Thread-ConsumeBidirectionalStream" + + +class _RequestQueueGenerator(object): + """A helper for sending requests to a gRPC stream from a Queue. + + This generator takes requests off a given queue and yields them to gRPC. + + This helper is useful when you have an indeterminate, indefinite, or + otherwise open-ended set of requests to send through a request-streaming + (or bidirectional) RPC. + + The reason this is necessary is because gRPC takes an iterator as the + request for request-streaming RPCs. gRPC consumes this iterator in another + thread to allow it to block while generating requests for the stream. + However, if the generator blocks indefinitely gRPC will not be able to + clean up the thread as it'll be blocked on `next(iterator)` and not be able + to check the channel status to stop iterating. This helper mitigates that + by waiting on the queue with a timeout and checking the RPC state before + yielding. + + Finally, it allows for retrying without swapping queues because if it does + pull an item off the queue when the RPC is inactive, it'll immediately put + it back and then exit. This is necessary because yielding the item in this + case will cause gRPC to discard it. In practice, this means that the order + of messages is not guaranteed. If such a thing is necessary it would be + easy to use a priority queue. + + Example:: + + requests = request_queue_generator(q) + call = stub.StreamingRequest(iter(requests)) + requests.call = call + + for response in call: + print(response) + q.put(...) + + Note that it is possible to accomplish this behavior without "spinning" + (using a queue timeout). One possible way would be to use more threads to + multiplex the grpc end event with the queue, another possible way is to + use selectors and a custom event/queue object. Both of these approaches + are significant from an engineering perspective for small benefit - the + CPU consumed by spinning is pretty minuscule. + + Args: + queue (queue.Queue): The request queue. + period (float): The number of seconds to wait for items from the queue + before checking if the RPC is cancelled. In practice, this + determines the maximum amount of time the request consumption + thread will live after the RPC is cancelled. + initial_request (Union[protobuf.Message, + Callable[None, protobuf.Message]]): The initial request to + yield. This is done independently of the request queue to allow fo + easily restarting streams that require some initial configuration + request. + """ + + def __init__(self, queue, period=1, initial_request=None): + self._queue = queue + self._period = period + self._initial_request = initial_request + self.call = None + + def _is_active(self): + # Note: there is a possibility that this starts *before* the call + # property is set. So we have to check if self.call is set before + # seeing if it's active. + if self.call is not None and not self.call.is_active(): + return False + else: + return True + + def __iter__(self): + if self._initial_request is not None: + if callable(self._initial_request): + yield self._initial_request() + else: + yield self._initial_request + + while True: + try: + item = self._queue.get(timeout=self._period) + except queue.Empty: + if not self._is_active(): + _LOGGER.debug( + "Empty queue and inactive call, exiting request " "generator." + ) + return + else: + # call is still active, keep waiting for queue items. + continue + + # The consumer explicitly sent "None", indicating that the request + # should end. + if item is None: + _LOGGER.debug("Cleanly exiting request generator.") + return + + if not self._is_active(): + # We have an item, but the call is closed. We should put the + # item back on the queue so that the next call can consume it. + self._queue.put(item) + _LOGGER.debug( + "Inactive call, replacing item on queue and exiting " + "request generator." + ) + return + + yield item + + +class BidiRpc(object): + """A helper for consuming a bi-directional streaming RPC. + + This maps gRPC's built-in interface which uses a request iterator and a + response iterator into a socket-like :func:`send` and :func:`recv`. This + is a more useful pattern for long-running or asymmetric streams (streams + where there is not a direct correlation between the requests and + responses). + + Example:: + + initial_request = example_pb2.StreamingRpcRequest( + setting='example') + rpc = BidiRpc(stub.StreamingRpc, initial_request=initial_request) + + rpc.open() + + while rpc.is_active(): + print(rpc.recv()) + rpc.send(example_pb2.StreamingRpcRequest( + data='example')) + + This does *not* retry the stream on errors. See :class:`ResumableBidiRpc`. + + Args: + start_rpc (grpc.StreamStreamMultiCallable): The gRPC method used to + start the RPC. + initial_request (Union[protobuf.Message, + Callable[None, protobuf.Message]]): The initial request to + yield. This is useful if an initial request is needed to start the + stream. + """ + + def __init__(self, start_rpc, initial_request=None): + self._start_rpc = start_rpc + self._initial_request = initial_request + self._request_queue = queue.Queue() + self._request_generator = None + self._is_active = False + self._callbacks = [] + self.call = None + + def add_done_callback(self, callback): + """Adds a callback that will be called when the RPC terminates. + + This occurs when the RPC errors or is successfully terminated. + + Args: + callback (Callable[[grpc.Future], None]): The callback to execute. + It will be provided with the same gRPC future as the underlying + stream which will also be a :class:`grpc.Call`. + """ + self._callbacks.append(callback) + + def _on_call_done(self, future): + for callback in self._callbacks: + callback(future) + + def open(self): + """Opens the stream.""" + if self.is_active: + raise ValueError("Can not open an already open stream.") + + request_generator = _RequestQueueGenerator( + self._request_queue, initial_request=self._initial_request + ) + call = self._start_rpc(iter(request_generator)) + + request_generator.call = call + + # TODO: api_core should expose the future interface for wrapped + # callables as well. + if hasattr(call, "_wrapped"): # pragma: NO COVER + call._wrapped.add_done_callback(self._on_call_done) + else: + call.add_done_callback(self._on_call_done) + + self._request_generator = request_generator + self.call = call + + def close(self): + """Closes the stream.""" + if self.call is None: + return + + self._request_queue.put(None) + self.call.cancel() + self._request_generator = None + # Don't set self.call to None. Keep it around so that send/recv can + # raise the error. + + def send(self, request): + """Queue a message to be sent on the stream. + + Send is non-blocking. + + If the underlying RPC has been closed, this will raise. + + Args: + request (protobuf.Message): The request to send. + """ + if self.call is None: + raise ValueError("Can not send() on an RPC that has never been open()ed.") + + # Don't use self.is_active(), as ResumableBidiRpc will overload it + # to mean something semantically different. + if self.call.is_active(): + self._request_queue.put(request) + else: + # calling next should cause the call to raise. + next(self.call) + + def recv(self): + """Wait for a message to be returned from the stream. + + Recv is blocking. + + If the underlying RPC has been closed, this will raise. + + Returns: + protobuf.Message: The received message. + """ + if self.call is None: + raise ValueError("Can not recv() on an RPC that has never been open()ed.") + + return next(self.call) + + @property + def is_active(self): + """bool: True if this stream is currently open and active.""" + return self.call is not None and self.call.is_active() + + @property + def pending_requests(self): + """int: Returns an estimate of the number of queued requests.""" + return self._request_queue.qsize() + + +class ResumableBidiRpc(BidiRpc): + """A :class:`BidiRpc` that can automatically resume the stream on errors. + + It uses the ``should_recover`` arg to determine if it should re-establish + the stream on error. + + Example:: + + def should_recover(exc): + return ( + isinstance(exc, grpc.RpcError) and + exc.code() == grpc.StatusCode.UNVAILABLE) + + initial_request = example_pb2.StreamingRpcRequest( + setting='example') + + rpc = ResumeableBidiRpc( + stub.StreamingRpc, + initial_request=initial_request, + should_recover=should_recover) + + rpc.open() + + while rpc.is_active(): + print(rpc.recv()) + rpc.send(example_pb2.StreamingRpcRequest( + data='example')) + + Args: + start_rpc (grpc.StreamStreamMultiCallable): The gRPC method used to + start the RPC. + initial_request (Union[protobuf.Message, + Callable[None, protobuf.Message]]): The initial request to + yield. This is useful if an initial request is needed to start the + stream. + should_recover (Callable[[Exception], bool]): A function that returns + True if the stream should be recovered. This will be called + whenever an error is encountered on the stream. + """ + + def __init__(self, start_rpc, should_recover, initial_request=None): + super(ResumableBidiRpc, self).__init__(start_rpc, initial_request) + self._should_recover = should_recover + self._operational_lock = threading.RLock() + self._finalized = False + self._finalize_lock = threading.Lock() + + def _finalize(self, result): + with self._finalize_lock: + if self._finalized: + return + + for callback in self._callbacks: + callback(result) + + self._finalized = True + + def _on_call_done(self, future): + # Unlike the base class, we only execute the callbacks on a terminal + # error, not for errors that we can recover from. Note that grpc's + # "future" here is also a grpc.RpcError. + with self._operational_lock: + if not self._should_recover(future): + self._finalize(future) + else: + _LOGGER.debug("Re-opening stream from gRPC callback.") + self._reopen() + + def _reopen(self): + with self._operational_lock: + # Another thread already managed to re-open this stream. + if self.call is not None and self.call.is_active(): + _LOGGER.debug("Stream was already re-established.") + return + + self.call = None + # Request generator should exit cleanly since the RPC its bound to + # has exited. + self.request_generator = None + + # Note: we do not currently do any sort of backoff here. The + # assumption is that re-establishing the stream under normal + # circumstances will happen in intervals greater than 60s. + # However, it is possible in a degenerative case that the server + # closes the stream rapidly which would lead to thrashing here, + # but hopefully in those cases the server would return a non- + # retryable error. + + try: + self.open() + # If re-opening or re-calling the method fails for any reason, + # consider it a terminal error and finalize the stream. + except Exception as exc: + _LOGGER.debug("Failed to re-open stream due to %s", exc) + self._finalize(exc) + raise + + _LOGGER.info("Re-established stream") + + def _recoverable(self, method, *args, **kwargs): + """Wraps a method to recover the stream and retry on error. + + If a retryable error occurs while making the call, then the stream will + be re-opened and the method will be retried. This happens indefinitely + so long as the error is a retryable one. If an error occurs while + re-opening the stream, then this method will raise immediately and + trigger finalization of this object. + + Args: + method (Callable[..., Any]): The method to call. + args: The args to pass to the method. + kwargs: The kwargs to pass to the method. + """ + while True: + try: + return method(*args, **kwargs) + + except Exception as exc: + with self._operational_lock: + _LOGGER.debug("Call to retryable %r caused %s.", method, exc) + + if not self._should_recover(exc): + self.close() + _LOGGER.debug("Not retrying %r due to %s.", method, exc) + self._finalize(exc) + raise exc + + _LOGGER.debug("Re-opening stream from retryable %r.", method) + self._reopen() + + def _send(self, request): + # Grab a reference to the RPC call. Because another thread (notably + # the gRPC error thread) can modify self.call (by invoking reopen), + # we should ensure our reference can not change underneath us. + # If self.call is modified (such as replaced with a new RPC call) then + # this will use the "old" RPC, which should result in the same + # exception passed into gRPC's error handler being raised here, which + # will be handled by the usual error handling in retryable. + with self._operational_lock: + call = self.call + + if call is None: + raise ValueError("Can not send() on an RPC that has never been open()ed.") + + # Don't use self.is_active(), as ResumableBidiRpc will overload it + # to mean something semantically different. + if call.is_active(): + self._request_queue.put(request) + pass + else: + # calling next should cause the call to raise. + next(call) + + def send(self, request): + return self._recoverable(self._send, request) + + def _recv(self): + with self._operational_lock: + call = self.call + + if call is None: + raise ValueError("Can not recv() on an RPC that has never been open()ed.") + + return next(call) + + def recv(self): + return self._recoverable(self._recv) + + @property + def is_active(self): + """bool: True if this stream is currently open and active.""" + # Use the operational lock. It's entirely possible for something + # to check the active state *while* the RPC is being retried. + # Also, use finalized to track the actual terminal state here. + # This is because if the stream is re-established by the gRPC thread + # it's technically possible to check this between when gRPC marks the + # RPC as inactive and when gRPC executes our callback that re-opens + # the stream. + with self._operational_lock: + return self.call is not None and not self._finalized + + +class BackgroundConsumer(object): + """A bi-directional stream consumer that runs in a separate thread. + + This maps the consumption of a stream into a callback-based model. It also + provides :func:`pause` and :func:`resume` to allow for flow-control. + + Example:: + + def should_recover(exc): + return ( + isinstance(exc, grpc.RpcError) and + exc.code() == grpc.StatusCode.UNVAILABLE) + + initial_request = example_pb2.StreamingRpcRequest( + setting='example') + + rpc = ResumeableBidiRpc( + stub.StreamingRpc, + initial_request=initial_request, + should_recover=should_recover) + + def on_response(response): + print(response) + + consumer = BackgroundConsumer(rpc, on_response) + consumer.start() + + Note that error handling *must* be done by using the provided + ``bidi_rpc``'s ``add_done_callback``. This helper will automatically exit + whenever the RPC itself exits and will not provide any error details. + + Args: + bidi_rpc (BidiRpc): The RPC to consume. Should not have been + ``open()``ed yet. + on_response (Callable[[protobuf.Message], None]): The callback to + be called for every response on the stream. + """ + + def __init__(self, bidi_rpc, on_response): + self._bidi_rpc = bidi_rpc + self._on_response = on_response + self._paused = False + self._wake = threading.Condition() + self._thread = None + self._operational_lock = threading.Lock() + + def _on_call_done(self, future): + # Resume the thread if it's paused, this prevents blocking forever + # when the RPC has terminated. + self.resume() + + def _thread_main(self): + try: + self._bidi_rpc.add_done_callback(self._on_call_done) + self._bidi_rpc.open() + + while self._bidi_rpc.is_active: + # Do not allow the paused status to change at all during this + # section. There is a condition where we could be resumed + # between checking if we are paused and calling wake.wait(), + # which means that we will miss the notification to wake up + # (oops!) and wait for a notification that will never come. + # Keeping the lock throughout avoids that. + # In the future, we could use `Condition.wait_for` if we drop + # Python 2.7. + with self._wake: + if self._paused: + _LOGGER.debug("paused, waiting for waking.") + self._wake.wait() + _LOGGER.debug("woken.") + + _LOGGER.debug("waiting for recv.") + response = self._bidi_rpc.recv() + _LOGGER.debug("recved response.") + self._on_response(response) + + except exceptions.GoogleAPICallError as exc: + _LOGGER.debug( + "%s caught error %s and will exit. Generally this is due to " + "the RPC itself being cancelled and the error will be " + "surfaced to the calling code.", + _BIDIRECTIONAL_CONSUMER_NAME, + exc, + exc_info=True, + ) + + except Exception as exc: + _LOGGER.exception( + "%s caught unexpected exception %s and will exit.", + _BIDIRECTIONAL_CONSUMER_NAME, + exc, + ) + + else: + _LOGGER.error("The bidirectional RPC exited.") + + _LOGGER.info("%s exiting", _BIDIRECTIONAL_CONSUMER_NAME) + + def start(self): + """Start the background thread and begin consuming the thread.""" + with self._operational_lock: + thread = threading.Thread( + name=_BIDIRECTIONAL_CONSUMER_NAME, target=self._thread_main + ) + thread.daemon = True + thread.start() + self._thread = thread + _LOGGER.debug("Started helper thread %s", thread.name) + + def stop(self): + """Stop consuming the stream and shutdown the background thread.""" + with self._operational_lock: + self._bidi_rpc.close() + + if self._thread is not None: + # Resume the thread to wake it up in case it is sleeping. + self.resume() + self._thread.join() + + self._thread = None + + @property + def is_active(self): + """bool: True if the background thread is active.""" + return self._thread is not None and self._thread.is_alive() + + def pause(self): + """Pauses the response stream. + + This does *not* pause the request stream. + """ + with self._wake: + self._paused = True + + def resume(self): + """Resumes the response stream.""" + with self._wake: + self._paused = False + self._wake.notifyAll() + + @property + def is_paused(self): + """bool: True if the response stream is paused.""" + return self._paused diff --git a/venv/lib/python3.6/site-packages/google/api_core/datetime_helpers.py b/venv/lib/python3.6/site-packages/google/api_core/datetime_helpers.py new file mode 100644 index 0000000..3f3523b --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/datetime_helpers.py @@ -0,0 +1,265 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Helpers for :mod:`datetime`.""" + +import calendar +import datetime +import re + +import pytz + + +_UTC_EPOCH = datetime.datetime.utcfromtimestamp(0).replace(tzinfo=pytz.utc) +_RFC3339_MICROS = "%Y-%m-%dT%H:%M:%S.%fZ" +_RFC3339_NO_FRACTION = "%Y-%m-%dT%H:%M:%S" +# datetime.strptime cannot handle nanosecond precision: parse w/ regex +_RFC3339_NANOS = re.compile( + r""" + (?P + \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2} # YYYY-MM-DDTHH:MM:SS + ) + ( # Optional decimal part + \. # decimal point + (?P\d{1,9}) # nanoseconds, maybe truncated + )? + Z # Zulu +""", + re.VERBOSE, +) + + +def utcnow(): + """A :meth:`datetime.datetime.utcnow()` alias to allow mocking in tests.""" + return datetime.datetime.utcnow() + + +def to_milliseconds(value): + """Convert a zone-aware datetime to milliseconds since the unix epoch. + + Args: + value (datetime.datetime): The datetime to covert. + + Returns: + int: Milliseconds since the unix epoch. + """ + micros = to_microseconds(value) + return micros // 1000 + + +def from_microseconds(value): + """Convert timestamp in microseconds since the unix epoch to datetime. + + Args: + value (float): The timestamp to convert, in microseconds. + + Returns: + datetime.datetime: The datetime object equivalent to the timestamp in + UTC. + """ + return _UTC_EPOCH + datetime.timedelta(microseconds=value) + + +def to_microseconds(value): + """Convert a datetime to microseconds since the unix epoch. + + Args: + value (datetime.datetime): The datetime to covert. + + Returns: + int: Microseconds since the unix epoch. + """ + if not value.tzinfo: + value = value.replace(tzinfo=pytz.utc) + # Regardless of what timezone is on the value, convert it to UTC. + value = value.astimezone(pytz.utc) + # Convert the datetime to a microsecond timestamp. + return int(calendar.timegm(value.timetuple()) * 1e6) + value.microsecond + + +def from_iso8601_date(value): + """Convert a ISO8601 date string to a date. + + Args: + value (str): The ISO8601 date string. + + Returns: + datetime.date: A date equivalent to the date string. + """ + return datetime.datetime.strptime(value, "%Y-%m-%d").date() + + +def from_iso8601_time(value): + """Convert a zoneless ISO8601 time string to a time. + + Args: + value (str): The ISO8601 time string. + + Returns: + datetime.time: A time equivalent to the time string. + """ + return datetime.datetime.strptime(value, "%H:%M:%S").time() + + +def from_rfc3339(value): + """Convert a microsecond-precision timestamp to datetime. + + Args: + value (str): The RFC3339 string to convert. + + Returns: + datetime.datetime: The datetime object equivalent to the timestamp in + UTC. + """ + return datetime.datetime.strptime(value, _RFC3339_MICROS).replace(tzinfo=pytz.utc) + + +def from_rfc3339_nanos(value): + """Convert a nanosecond-precision timestamp to a native datetime. + + .. note:: + Python datetimes do not support nanosecond precision; this function + therefore truncates such values to microseconds. + + Args: + value (str): The RFC3339 string to convert. + + Returns: + datetime.datetime: The datetime object equivalent to the timestamp in + UTC. + + Raises: + ValueError: If the timestamp does not match the RFC 3339 + regular expression. + """ + with_nanos = _RFC3339_NANOS.match(value) + + if with_nanos is None: + raise ValueError( + "Timestamp: {!r}, does not match pattern: {!r}".format( + value, _RFC3339_NANOS.pattern + ) + ) + + bare_seconds = datetime.datetime.strptime( + with_nanos.group("no_fraction"), _RFC3339_NO_FRACTION + ) + fraction = with_nanos.group("nanos") + + if fraction is None: + micros = 0 + else: + scale = 9 - len(fraction) + nanos = int(fraction) * (10 ** scale) + micros = nanos // 1000 + + return bare_seconds.replace(microsecond=micros, tzinfo=pytz.utc) + + +def to_rfc3339(value, ignore_zone=True): + """Convert a datetime to an RFC3339 timestamp string. + + Args: + value (datetime.datetime): + The datetime object to be converted to a string. + ignore_zone (bool): If True, then the timezone (if any) of the + datetime object is ignored and the datetime is treated as UTC. + + Returns: + str: The RFC3339 formated string representing the datetime. + """ + if not ignore_zone and value.tzinfo is not None: + # Convert to UTC and remove the time zone info. + value = value.replace(tzinfo=None) - value.utcoffset() + + return value.strftime(_RFC3339_MICROS) + + +class DatetimeWithNanoseconds(datetime.datetime): + """Track nanosecond in addition to normal datetime attrs. + + Nanosecond can be passed only as a keyword argument. + """ + + __slots__ = ("_nanosecond",) + + # pylint: disable=arguments-differ + def __new__(cls, *args, **kw): + nanos = kw.pop("nanosecond", 0) + if nanos > 0: + if "microsecond" in kw: + raise TypeError("Specify only one of 'microsecond' or 'nanosecond'") + kw["microsecond"] = nanos // 1000 + inst = datetime.datetime.__new__(cls, *args, **kw) + inst._nanosecond = nanos or 0 + return inst + + # pylint: disable=arguments-differ + + @property + def nanosecond(self): + """Read-only: nanosecond precision.""" + return self._nanosecond + + def rfc3339(self): + """Return an RFC 3339-compliant timestamp. + + Returns: + (str): Timestamp string according to RFC 3339 spec. + """ + if self._nanosecond == 0: + return to_rfc3339(self) + nanos = str(self._nanosecond).rstrip("0") + return "{}.{}Z".format(self.strftime(_RFC3339_NO_FRACTION), nanos) + + @classmethod + def from_rfc3339(cls, stamp): + """Parse RFC 3339-compliant timestamp, preserving nanoseconds. + + Args: + stamp (str): RFC 3339 stamp, with up to nanosecond precision + + Returns: + :class:`DatetimeWithNanoseconds`: + an instance matching the timestamp string + + Raises: + ValueError: if `stamp` does not match the expected format + """ + with_nanos = _RFC3339_NANOS.match(stamp) + if with_nanos is None: + raise ValueError( + "Timestamp: {}, does not match pattern: {}".format( + stamp, _RFC3339_NANOS.pattern + ) + ) + bare = datetime.datetime.strptime( + with_nanos.group("no_fraction"), _RFC3339_NO_FRACTION + ) + fraction = with_nanos.group("nanos") + if fraction is None: + nanos = 0 + else: + scale = 9 - len(fraction) + nanos = int(fraction) * (10 ** scale) + return cls( + bare.year, + bare.month, + bare.day, + bare.hour, + bare.minute, + bare.second, + nanosecond=nanos, + tzinfo=pytz.UTC, + ) diff --git a/venv/lib/python3.6/site-packages/google/api_core/exceptions.py b/venv/lib/python3.6/site-packages/google/api_core/exceptions.py new file mode 100644 index 0000000..eed4ee4 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/exceptions.py @@ -0,0 +1,462 @@ +# Copyright 2014 Google LLC +# +# 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 Google API core & clients. + +This module provides base classes for all errors raised by libraries based +on :mod:`google.api_core`, including both HTTP and gRPC clients. +""" + +from __future__ import absolute_import +from __future__ import unicode_literals + +import six +from six.moves import http_client + +try: + import grpc +except ImportError: # pragma: NO COVER + grpc = None + +# Lookup tables for mapping exceptions from HTTP and gRPC transports. +# Populated by _APICallErrorMeta +_HTTP_CODE_TO_EXCEPTION = {} +_GRPC_CODE_TO_EXCEPTION = {} + + +class GoogleAPIError(Exception): + """Base class for all exceptions raised by Google API Clients.""" + + pass + + +@six.python_2_unicode_compatible +class RetryError(GoogleAPIError): + """Raised when a function has exhausted all of its available retries. + + Args: + message (str): The exception message. + cause (Exception): The last exception raised when retring the + function. + """ + + def __init__(self, message, cause): + super(RetryError, self).__init__(message) + self.message = message + self._cause = cause + + @property + def cause(self): + """The last exception raised when retrying the function.""" + return self._cause + + def __str__(self): + return "{}, last exception: {}".format(self.message, self.cause) + + +class _GoogleAPICallErrorMeta(type): + """Metaclass for registering GoogleAPICallError subclasses.""" + + def __new__(mcs, name, bases, class_dict): + cls = type.__new__(mcs, name, bases, class_dict) + if cls.code is not None: + _HTTP_CODE_TO_EXCEPTION.setdefault(cls.code, cls) + if cls.grpc_status_code is not None: + _GRPC_CODE_TO_EXCEPTION.setdefault(cls.grpc_status_code, cls) + return cls + + +@six.python_2_unicode_compatible +@six.add_metaclass(_GoogleAPICallErrorMeta) +class GoogleAPICallError(GoogleAPIError): + """Base class for exceptions raised by calling API methods. + + Args: + message (str): The exception message. + errors (Sequence[Any]): An optional list of error details. + response (Union[requests.Request, grpc.Call]): The response or + gRPC call metadata. + """ + + code = None + """Optional[int]: The HTTP status code associated with this error. + + This may be ``None`` if the exception does not have a direct mapping + to an HTTP error. + + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + """ + + grpc_status_code = None + """Optional[grpc.StatusCode]: The gRPC status code associated with this + error. + + This may be ``None`` if the exception does not match up to a gRPC error. + """ + + def __init__(self, message, errors=(), response=None): + super(GoogleAPICallError, self).__init__(message) + self.message = message + """str: The exception message.""" + self._errors = errors + self._response = response + + def __str__(self): + return "{} {}".format(self.code, self.message) + + @property + def errors(self): + """Detailed error information. + + Returns: + Sequence[Any]: A list of additional error details. + """ + return list(self._errors) + + @property + def response(self): + """Optional[Union[requests.Request, grpc.Call]]: The response or + gRPC call metadata.""" + return self._response + + +class Redirection(GoogleAPICallError): + """Base class for for all redirection (HTTP 3xx) responses.""" + + +class MovedPermanently(Redirection): + """Exception mapping a ``301 Moved Permanently`` response.""" + + code = http_client.MOVED_PERMANENTLY + + +class NotModified(Redirection): + """Exception mapping a ``304 Not Modified`` response.""" + + code = http_client.NOT_MODIFIED + + +class TemporaryRedirect(Redirection): + """Exception mapping a ``307 Temporary Redirect`` response.""" + + code = http_client.TEMPORARY_REDIRECT + + +class ResumeIncomplete(Redirection): + """Exception mapping a ``308 Resume Incomplete`` response. + + .. note:: :attr:`http_client.PERMANENT_REDIRECT` is ``308``, but Google + APIs differ in their use of this status code. + """ + + code = 308 + + +class ClientError(GoogleAPICallError): + """Base class for all client error (HTTP 4xx) responses.""" + + +class BadRequest(ClientError): + """Exception mapping a ``400 Bad Request`` response.""" + + code = http_client.BAD_REQUEST + + +class InvalidArgument(BadRequest): + """Exception mapping a :attr:`grpc.StatusCode.INVALID_ARGUMENT` error.""" + + grpc_status_code = grpc.StatusCode.INVALID_ARGUMENT if grpc is not None else None + + +class FailedPrecondition(BadRequest): + """Exception mapping a :attr:`grpc.StatusCode.FAILED_PRECONDITION` + error.""" + + grpc_status_code = grpc.StatusCode.FAILED_PRECONDITION if grpc is not None else None + + +class OutOfRange(BadRequest): + """Exception mapping a :attr:`grpc.StatusCode.OUT_OF_RANGE` error.""" + + grpc_status_code = grpc.StatusCode.OUT_OF_RANGE if grpc is not None else None + + +class Unauthorized(ClientError): + """Exception mapping a ``401 Unauthorized`` response.""" + + code = http_client.UNAUTHORIZED + + +class Unauthenticated(Unauthorized): + """Exception mapping a :attr:`grpc.StatusCode.UNAUTHENTICATED` error.""" + + grpc_status_code = grpc.StatusCode.UNAUTHENTICATED if grpc is not None else None + + +class Forbidden(ClientError): + """Exception mapping a ``403 Forbidden`` response.""" + + code = http_client.FORBIDDEN + + +class PermissionDenied(Forbidden): + """Exception mapping a :attr:`grpc.StatusCode.PERMISSION_DENIED` error.""" + + grpc_status_code = grpc.StatusCode.PERMISSION_DENIED if grpc is not None else None + + +class NotFound(ClientError): + """Exception mapping a ``404 Not Found`` response or a + :attr:`grpc.StatusCode.NOT_FOUND` error.""" + + code = http_client.NOT_FOUND + grpc_status_code = grpc.StatusCode.NOT_FOUND if grpc is not None else None + + +class MethodNotAllowed(ClientError): + """Exception mapping a ``405 Method Not Allowed`` response.""" + + code = http_client.METHOD_NOT_ALLOWED + + +class Conflict(ClientError): + """Exception mapping a ``409 Conflict`` response.""" + + code = http_client.CONFLICT + + +class AlreadyExists(Conflict): + """Exception mapping a :attr:`grpc.StatusCode.ALREADY_EXISTS` error.""" + + grpc_status_code = grpc.StatusCode.ALREADY_EXISTS if grpc is not None else None + + +class Aborted(Conflict): + """Exception mapping a :attr:`grpc.StatusCode.ABORTED` error.""" + + grpc_status_code = grpc.StatusCode.ABORTED if grpc is not None else None + + +class LengthRequired(ClientError): + """Exception mapping a ``411 Length Required`` response.""" + + code = http_client.LENGTH_REQUIRED + + +class PreconditionFailed(ClientError): + """Exception mapping a ``412 Precondition Failed`` response.""" + + code = http_client.PRECONDITION_FAILED + + +class RequestRangeNotSatisfiable(ClientError): + """Exception mapping a ``416 Request Range Not Satisfiable`` response.""" + + code = http_client.REQUESTED_RANGE_NOT_SATISFIABLE + + +class TooManyRequests(ClientError): + """Exception mapping a ``429 Too Many Requests`` response.""" + + # http_client does not define a constant for this in Python 2. + code = 429 + + +class ResourceExhausted(TooManyRequests): + """Exception mapping a :attr:`grpc.StatusCode.RESOURCE_EXHAUSTED` error.""" + + grpc_status_code = grpc.StatusCode.RESOURCE_EXHAUSTED if grpc is not None else None + + +class Cancelled(ClientError): + """Exception mapping a :attr:`grpc.StatusCode.CANCELLED` error.""" + + # This maps to HTTP status code 499. See + # https://github.com/googleapis/googleapis/blob/master/google/rpc\ + # /code.proto + code = 499 + grpc_status_code = grpc.StatusCode.CANCELLED if grpc is not None else None + + +class ServerError(GoogleAPICallError): + """Base for 5xx responses.""" + + +class InternalServerError(ServerError): + """Exception mapping a ``500 Internal Server Error`` response. or a + :attr:`grpc.StatusCode.INTERNAL` error.""" + + code = http_client.INTERNAL_SERVER_ERROR + grpc_status_code = grpc.StatusCode.INTERNAL if grpc is not None else None + + +class Unknown(ServerError): + """Exception mapping a :attr:`grpc.StatusCode.UNKNOWN` error.""" + + grpc_status_code = grpc.StatusCode.UNKNOWN if grpc is not None else None + + +class DataLoss(ServerError): + """Exception mapping a :attr:`grpc.StatusCode.DATA_LOSS` error.""" + + grpc_status_code = grpc.StatusCode.DATA_LOSS if grpc is not None else None + + +class MethodNotImplemented(ServerError): + """Exception mapping a ``501 Not Implemented`` response or a + :attr:`grpc.StatusCode.UNIMPLEMENTED` error.""" + + code = http_client.NOT_IMPLEMENTED + grpc_status_code = grpc.StatusCode.UNIMPLEMENTED if grpc is not None else None + + +class BadGateway(ServerError): + """Exception mapping a ``502 Bad Gateway`` response.""" + + code = http_client.BAD_GATEWAY + + +class ServiceUnavailable(ServerError): + """Exception mapping a ``503 Service Unavailable`` response or a + :attr:`grpc.StatusCode.UNAVAILABLE` error.""" + + code = http_client.SERVICE_UNAVAILABLE + grpc_status_code = grpc.StatusCode.UNAVAILABLE if grpc is not None else None + + +class GatewayTimeout(ServerError): + """Exception mapping a ``504 Gateway Timeout`` response.""" + + code = http_client.GATEWAY_TIMEOUT + + +class DeadlineExceeded(GatewayTimeout): + """Exception mapping a :attr:`grpc.StatusCode.DEADLINE_EXCEEDED` error.""" + + grpc_status_code = grpc.StatusCode.DEADLINE_EXCEEDED if grpc is not None else None + + +def exception_class_for_http_status(status_code): + """Return the exception class for a specific HTTP status code. + + Args: + status_code (int): The HTTP status code. + + Returns: + :func:`type`: the appropriate subclass of :class:`GoogleAPICallError`. + """ + return _HTTP_CODE_TO_EXCEPTION.get(status_code, GoogleAPICallError) + + +def from_http_status(status_code, message, **kwargs): + """Create a :class:`GoogleAPICallError` from an HTTP status code. + + Args: + status_code (int): The HTTP status code. + message (str): The exception message. + kwargs: Additional arguments passed to the :class:`GoogleAPICallError` + constructor. + + Returns: + GoogleAPICallError: An instance of the appropriate subclass of + :class:`GoogleAPICallError`. + """ + error_class = exception_class_for_http_status(status_code) + error = error_class(message, **kwargs) + + if error.code is None: + error.code = status_code + + return error + + +def from_http_response(response): + """Create a :class:`GoogleAPICallError` from a :class:`requests.Response`. + + Args: + response (requests.Response): The HTTP response. + + Returns: + GoogleAPICallError: An instance of the appropriate subclass of + :class:`GoogleAPICallError`, with the message and errors populated + from the response. + """ + try: + payload = response.json() + except ValueError: + payload = {"error": {"message": response.text or "unknown error"}} + + error_message = payload.get("error", {}).get("message", "unknown error") + errors = payload.get("error", {}).get("errors", ()) + + message = "{method} {url}: {error}".format( + method=response.request.method, url=response.request.url, error=error_message + ) + + exception = from_http_status( + response.status_code, message, errors=errors, response=response + ) + return exception + + +def exception_class_for_grpc_status(status_code): + """Return the exception class for a specific :class:`grpc.StatusCode`. + + Args: + status_code (grpc.StatusCode): The gRPC status code. + + Returns: + :func:`type`: the appropriate subclass of :class:`GoogleAPICallError`. + """ + return _GRPC_CODE_TO_EXCEPTION.get(status_code, GoogleAPICallError) + + +def from_grpc_status(status_code, message, **kwargs): + """Create a :class:`GoogleAPICallError` from a :class:`grpc.StatusCode`. + + Args: + status_code (grpc.StatusCode): The gRPC status code. + message (str): The exception message. + kwargs: Additional arguments passed to the :class:`GoogleAPICallError` + constructor. + + Returns: + GoogleAPICallError: An instance of the appropriate subclass of + :class:`GoogleAPICallError`. + """ + error_class = exception_class_for_grpc_status(status_code) + error = error_class(message, **kwargs) + + if error.grpc_status_code is None: + error.grpc_status_code = status_code + + return error + + +def from_grpc_error(rpc_exc): + """Create a :class:`GoogleAPICallError` from a :class:`grpc.RpcError`. + + Args: + rpc_exc (grpc.RpcError): The gRPC error. + + Returns: + GoogleAPICallError: An instance of the appropriate subclass of + :class:`GoogleAPICallError`. + """ + if isinstance(rpc_exc, grpc.Call): + return from_grpc_status( + rpc_exc.code(), rpc_exc.details(), errors=(rpc_exc,), response=rpc_exc + ) + else: + return GoogleAPICallError(str(rpc_exc), errors=(rpc_exc,), response=rpc_exc) diff --git a/venv/lib/python3.6/site-packages/google/api_core/future/__init__.py b/venv/lib/python3.6/site-packages/google/api_core/future/__init__.py new file mode 100644 index 0000000..3768b2c --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/future/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2017, Google LLC +# +# 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. + +"""Futures for dealing with asynchronous operations.""" + +from google.api_core.future.base import Future + +__all__ = ["Future"] diff --git a/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dbab15498bf8231907bcdde2f7f7a930a4ede8a GIT binary patch literal 303 zcmYj~u};G<6h$33r3kgK!{RkVVii_|m>3vX*dnASH+EA?j-Rm;q4G!k1Rs(KiHToe zs*`}!C%r3O>E3g1R;#n+*ZIpQCFGkNUG(HWez=SxNl9cPsYx1I(uBxaos=_~K9g+z zzJBQ1&a1$-=$TZ)Xj`*4-R_tOdt2>1TI>Qtr@Ux2+EDyNB*~KgWNP|h>nTh71%Si~ zpuDOPYoiL`G*swSu^lIhjRy1R(@kVZ-Ak{$qJS66QU literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/_helpers.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/_helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..282f0713bdc7f7745853ef3701de3010bfabf65e GIT binary patch literal 819 zcmYjPPjAyO6t|r;O~X2n;J^W)oDh|0%f<-_AueSCO&g*+K!s#^v74sNKOA?ZRXCON zz6W2)r%9an3Y>U$+G&>Z-t+tSd++DG>UM*Jo5OE6E<%6MokPHW2VZpzf};uIn3EJw zu+?Nj1fDy>-Qr1$JKX(+CLV8b4|JQ8G3vE9Pd>@yiYXD!L|O`2h0{WY)1_KUQ4Rh= zS9BH`X^yk|&OujCK`1oGHLCG7{z*8l2_-d|J6nWNZMu`q%duioRUr%2ObW(Bmh&)U za#4ke3YiITCbA;m#RnHXS9hA+B#*UsVav4FWa(CA`t=;`G8tFeTdW%0RQyJ=15^F` zI8<3VER(W-xlB^t&*bsZcP98SE{Zr6eO4y@sE}fJAHtp5d$aeD?zk9~YyHq7(gvS4 zIFHT#J_tk(u!nst?|~g*TLkhs29hvRcn-vEF-Bie zPQD=fD9+~fhy1Eo2w*2-X?n?`#fz|7fmy786-#1T#BpP18q=Xk- z&5~3=KtxMr(%#z_y=^x*0}eZ*eVuO8)AN&)(P!Pc?F9+`9$k8{g=`yP2yR3GmVQ*R zsi27+m+sR;h&24T1PAyK%Lm};`2a(C5mBn!yYZ#@fpsSq>J;`7Qu~zVEEANa`_}F&>$M^pO{LI;A literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/base.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14c714e23c63bda5156b7518f8d4189bfde607ff GIT binary patch literal 1792 zcmb_c%Wl&^6dga3IL|ipL6=^zAQDY@N~i+VQc=W$Y+w~3naRwgb#QEV#+FK!q+h^a z@Jn7HvEmO9EAAa9!GsE-s1wb#&)k_gXU;hHL9z-#qCSNZBd$8Gh+)*UmlQc=CaQ#Ufh=~Xjn)p$uy5E72^cluQv*G0sy7~-35D-BICN~C_u*W5C za_f>HtwuI4X;jgu%qto>8aceGQB|WIUgwQV16I~F-sMf+(zvei2H(`P8ydCw4UL)_ zZSif5TD%5Fy_uEs!%PQ@LxqWuBg#a#R&$}fJ@b|8F9uxz=mU47&^=%QRqEh9i$a!4 z2}X2B+8Nc&H+$dJTQCC-j}4#LkD;p?goMnOD1tI_T&9w>IZy(BJbZjr-JuRqv$jc`!x3VStP|A_W*ku=h}KGzZ-wd z%8Z6g1TJbZArN!g%w>1;%zw+47Od_V5-(e8%maLwB&+6o1%lrKxFFj6g9wt>!c~!J z82aJq?E+J4&NNS53y;mCP~0hy)aN8P-e=lO$l~)~x1HN&YTL3(;!i}BCaeCHrBG>* z+%2#zZYj^KMJMa9-zrsATrd&iUl}XM>Qyb1YY}GVC|u=hQ_elK%wseNhLnAHyyUf} zdvj0!nzRp^g02ev&PL{V zUPvdx^Rk-fO(LEK_}=im^OOejOvM8?84O!=$g&olm+*;5&LS==sK&ui#emf(H$}_b zK)8vajR6ZyA>cn*;^({zUF|_|9NTQ!`Oh{Q7WP)DW$Rg;irm2!I6JeHe~~ru7C{Kr q6*H?GJwJX8C@V+9v0#Z_Rp8U~x_mfK^20tufePi@reiwRw($#Bg?e-V literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/polling.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/future/__pycache__/polling.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f89bc5c6d332bdc98dae0976681debc426c1c49 GIT binary patch literal 5665 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/config.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/gapic_v1/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd5fa242e662f677880d26053961f1ac7655e453 GIT binary patch literal 4834 zcmeHL&2Jn@74NV4v_1a7c-PrQlq`WWQZlxK*uyA_VjQy=B_XmGkUDF%+g&x|HvQ%5 z8pjUf1M*6ULlzXbPpQdfX(+sSzVpnvOv7lYG ztFm2zcFnFqyK2{Ijn==?>;`SnCOn&Tj?Tk#j_K#~bb+?$V&Awm>;<|+m*IVj8b?}t z;*o|BY}U) zaq?OG28Stg1M?PXifn(WGB30j*%uY%Io(5U62 zeU#Il{_&}&%a*3$6Axk!u5<-%LOa)mA{7$;mHY?*3}`;Q8)Pp6{QW^3XdF8IBio)+x50c9cUP9QNEG*vEZ?4QN=q!VU1M{ry7N zk=h&x1gFmv&ruu9YJCPf6+E->t=&A5``!cR!TDL}mcMAc4ywNS`IZQit;A0ro(}wg zJ`DMzoeP)IEoI+Bu+A>42kdfi{r@Qf2Q5)H-?NQ?c5j|Uu#2+n(LY{Kf#t&v?}Y^uc|(+y{kaH z)!l!<0(*Hjxde_8QXxJ)XPzK^|B^)nB1|Tz4DfP_%?vXs=Oiw7!<5{oz9;f{Qwrn& z6O5BfHyE(A6lvYA3S2x+{Qb5R9QbC#k9^^~fuok8EO4)#&<_GX-RP2??d|Pyw8}Xp z*+C%u1X7=a{G-l~XNZUH)g9^|f&N(w6h=Xi<@rBh)LpYMBn#*pKl~=X5 z5AyKn@i@$zd7eKGV$TiIC!O&``(640N~L^z{p0qW(52P3rd4oE#nQTW!vNkg7(V$wsQnUz`pOIEV7(2-evcSkHve?b_kLwG7@do8YSw- z(97muNNT+&`MZP{xpa}hIHyS9zd=V47nR261~q+2ekF~8iUUbaF;!C3Ox^q(#=CC%@hZWjb*VbXRo4T-uDA|bC zXdQZ$^D2xs0Z3|}Af0N6`mjE1(7AWU&>UKiwToB3)`lj)$-Mh|0#3@Gr-?!#4+q83 zWf77WAbvrpWSIC7Frl97K{X=%Hv%xk#DjpAv?W;BfRoM#Kr+OcE5^z!=^ngqT{&AP=l29EB`W=h1{KzE(l9lHf^ULT^+Rqe`!4Gvo zWT2qed?Ye0h;^X*5ZU^l$5ck9Fy#Ckh;ghEI8K<#ZeTOW#wDBi9SkcrW4yf&pY@bE z%G%s#DG-9HC4>=Heby^umoqP7fqr@^u(*H|?b&lyXPe zi<2fm0E}!>T*<*Vt+H#gxx9~oVK3wzCC@)aJJ2~84OWPS@Uo|FJ3`5BHzq%KnTYwE9+PhfZuyoxWq!y^DLd@2Yzb_g>#q_l>wQZT6eC#Wyak zeoKv;VKdzL&g!?rR=A1pYhgRQhVQM}=wvCi#phn=v)ne(_vZ6|{f@^oE;2Ss1v?YLY!)SB7N=*sF+b%o8-Mx7eKzHCl7<;Oi{yk2)9Ex# z*l3;%Wt1jC9LYtm-9DN`8N>fP;~_g&PE}B@QhX4Kkj-1Z!%%a)u@jQyd-KqHSgJ%H`?~K!Q9P?c;XLpzio>cW@&u zX-j8mU)q<>g?)Z&X+N;O-MVm=&eFQHFRW*`z6NEW#(w_&-fR{xSis^alPn#vkOQkg zrce-wFks{8l$WxH*cm>9LAh)&fJ_$1%hMcA!xuFh<-45NOa)g zY!VG8P_8&u;Ep+q#tE1c_SAFNT{TBhETJ((=&B{4nF4Bt36Ine>R+JQ-z@G+aflY} zyXiyO;)P!<$Y7dQMsrrPBS|kz7;RmJ#)r`eM-`w590aKkV?)7}4XO=VQnVm5+g^R5L8;gR=(WS5 zt4q=Z*>~0{XxI1`o@Nn;|&yNOh8RU3Kd5Ak1m*7kdhy-neF+A*Ut~PRNSM4Z^ zl1v84kPFhx{u>A9Ggwq2qae=Z+21BN4J{AC7<$y-EN)kBl*mDet<*p}mY9lPy_TbLQr zwE2*=eTpml1qN>QZNx?=wEJ$j5xSv=nB|3yu!-o_2p!l^;S| z9<)R()(lR~sQ3##sHyHSr>sYcZ+vI2@n%k|KEi`0l0t7T#sZX4xt(>K@`;{Nfh!$B z0fwxbvINprbNcIHrqyUsgA^2w227q$p~B?S2=-O%t&ml6x{%<`WBzQ;VH8h}=ChbT z$)vc=Fnmi^ycdR%_IPAtTI4DqMOh7@JU>yMmCz_<%aHC+$XQfOzXzYG6P_uDl7uQZ zs=*7AMR{OhNGzNSN?}STvc|%s?!AI5us6eN%R@k1P8r z28vz2Me*Oamo7$U>0xw3l?5Djz14=Vb$`|Lm3ppP#;#YJzF}jxvGOt=k5)~+SiA|? z$}g>2X3e^%X!*#oB8icZQL)!hn9Pd4#>19ZD%MC6MGo?4-cDE?Ok!y8+8 z+gvvBt|gMOb(AygO;r>Py?Umd<diShl13Y#9PI0{P{NqQ6TTl5F%B&J- z#n3X!o;#w^XVCV_glHy`|6nfR-Q!oluD^HuaFtpyYHs}mN5*L=h&XT<#pVS z)3TfH4Hwyy3qMaj-flTp$WlY-+K1gHl*vzmDfj(V+xMqwIFIRm%lDtngE*hr@cl3y z`o8!XjuVurRnSt2HYtyI3&WpqW%R1m@tk&3y*nIIe54O)KWUEA{(HEQq%$h>UAmOV zi=Qvu6X((z+ZSHqg&3ua+zl%vw1VWi^g`!v9%XA?H~1VJ{~Co7=`bJzs9l;Tc!(HE)sSHm z*ufwNJQyfHW!!F-WBCxSou3C&IMBOybxuPbKbp=`A=!H9P~{!!lpYKnwPE4;Mk1ZA zFE%g~Hm|iZ$F#)aU6rDyBBH7=uJFB#28enLrs2yJIl&HTQDI~EDWU3?IWf^CC}g0> zxzA?vV;IeZ3;*=P-e+7M5r8lCw1RV=fOQMR^=``cDqAx-KQ1=!E&g`r}j*^s9x6-6)QB6x;u7Paktqu+jU;?8TFfzAO7QwpyXe8JHL z-5=wvvQCQX>$%aphKsL>g%Xq2r&5+z(M+eN35sbgV5AVgIX`Er>rp8ZrVGu$H3iVh z5RH6(KIF=reYu$Nx-g2ltoJBE_6@^$%mwn418S{wOU?N~wrYY59yybhhd~*yYpYZ| zRjnPQmT@5YuJKwbz|}hfC8HHwr92f;gZ-wT&|?S4UR2={qw#Y#L0@4octKltx^Q24 zrbZ!zhq-ThAFC_Mp;oa`Bw*4xkP?@Q>qFvI)Q1%SzN(oD2dTYE?TED%)att897Q$Z z^6FE3@I?!sXf!7h=SRxNy$ri@pQc%Jg;6p{+Ab#|osTEE*^XuU>pA2)l%%*w@x`zRcFZ8HTN@=w%8!ebCLollZ z%G+w?Rcf1`t2{*>-L==yLYsoUgi*{hU4veqD#oP!no6ol zOEyRK=1$(yGG}37Wpe?xz`%q*CBaI!W<8cEJv7~$e3SOU1t`)TREKb7x340VP$J?U;PU32)%VMpazIUp=Uu6e9lyN z`_zvJP)yZhM9-6cRS>%YTKdpYsS0Q^@%QQ#JORsVVlc`4ERa|H)h?S7`aCI$a_s_M zKrCQckQ6C{RtWSM3Aq>5CV{RfG?_y41z<+G3otM5H{_NKO|Ewo_u&wz(S@D{OZZvQ zgwgJfa{ugglYe3reT+9>-KKC+ zo%OF(e1HFjOnvpMjR7pEk+EvfnoJdX-GP0{L8V{+P0}4-38m;tDfuHww{XZNW?LF8#+S6q{{nDXpduo&_O8ak`rTd>hIygM?A00mYLZMY5 or>Klqt$Vt%{)DW%O7@4r?F`9ZEcHoiZ?A@8B# zq))iT?a=C5I6I*oIeo_>-0i!3hF3n5{tU138qO7Nzb4Ju$`%?WD0)3!f1d4H{Si63P*pS_(mCt4(gxF6wOqNbsL#(=0meNX@V3G7KeH0%(yEry+ z$h&A1IYdlv6K)?7v8?P* z4ucWIw5)-e8Z=@WZHiA<4CRJ-(_T>`UD;u2ib39CtX0~L#~+#-v`cw_ydhFzta(%{ zh;<^Jqzr!<=Q5T_RgkC)Dj6?xmo5BBkLfljYT)8rsf4nnwh1pZZf6dfiF0TD$+^`* z)LqF2&~$T0j%D5$VS8Aohhj;DmTz7akcP|$JX$Gw{6<6_ch2`ZDoQ(Pkhb=-Ampt` ztgjt2;2lj}2rZTdEk6-Z`W^JW!pAq?8?AN9p1eY}?R1>qREamex{Rr$&PVF=_JU=U*tMdDcjp=(eErkNa;&%M!a_D7g2rEW| zXi$P$8dDeV-<{JV7*9!(#hi{rkyYDy?E1mw!7`^Z1uX2yS=XWeCw^DrfG>; z + Retry.__call__() -> + Timeout.__call__() -> + wrap_errors() -> + get_topic() + + Note that if ``timeout`` or ``retry`` is ``None``, then they are not + applied to the function. For example, + ``wrapped_get_topic(timeout=None, retry=None)`` is more or less + equivalent to just calling ``get_topic`` but with error re-mapping. + + Args: + func (Callable[Any]): The function to wrap. It should accept an + optional ``timeout`` argument. If ``metadata`` is not ``None``, it + should accept a ``metadata`` argument. + default_retry (Optional[google.api_core.Retry]): The default retry + strategy. If ``None``, the method will not retry by default. + default_timeout (Optional[google.api_core.Timeout]): The default + timeout strategy. Can also be specified as an int or float. If + ``None``, the method will not have timeout specified by default. + client_info + (Optional[google.api_core.gapic_v1.client_info.ClientInfo]): + Client information used to create a user-agent string that's + passed as gRPC metadata to the method. If unspecified, then + a sane default will be used. If ``None``, then no user agent + metadata will be provided to the RPC method. + + Returns: + Callable: A new callable that takes optional ``retry`` and ``timeout`` + arguments and applies the common error mapping, retry, timeout, + and metadata behavior to the low-level RPC method. + """ + func = grpc_helpers.wrap_errors(func) + + if client_info is not None: + user_agent_metadata = [client_info.to_grpc_metadata()] + else: + user_agent_metadata = None + + return general_helpers.wraps(func)( + _GapicCallable( + func, default_retry, default_timeout, metadata=user_agent_metadata + ) + ) diff --git a/venv/lib/python3.6/site-packages/google/api_core/gapic_v1/routing_header.py b/venv/lib/python3.6/site-packages/google/api_core/gapic_v1/routing_header.py new file mode 100644 index 0000000..3fb12a6 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/gapic_v1/routing_header.py @@ -0,0 +1,62 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Helpers for constructing routing headers. + +These headers are used by Google infrastructure to determine how to route +requests, especially for services that are regional. + +Generally, these headers are specified as gRPC metadata. +""" + +import sys + +from six.moves.urllib.parse import urlencode + +ROUTING_METADATA_KEY = "x-goog-request-params" + + +def to_routing_header(params): + """Returns a routing header string for the given request parameters. + + Args: + params (Mapping[str, Any]): A dictionary containing the request + parameters used for routing. + + Returns: + str: The routing header string. + """ + if sys.version_info[0] < 3: + # Python 2 does not have the "safe" parameter for urlencode. + return urlencode(params).replace("%2F", "/") + return urlencode( + params, + # Per Google API policy (go/api-url-encoding), / is not encoded. + safe="/", + ) + + +def to_grpc_metadata(params): + """Returns the gRPC metadata containing the routing headers for the given + request parameters. + + Args: + params (Mapping[str, Any]): A dictionary containing the request + parameters used for routing. + + Returns: + Tuple(str, str): The gRPC metadata containing the routing header key + and value. + """ + return (ROUTING_METADATA_KEY, to_routing_header(params)) diff --git a/venv/lib/python3.6/site-packages/google/api_core/general_helpers.py b/venv/lib/python3.6/site-packages/google/api_core/general_helpers.py new file mode 100644 index 0000000..5661663 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/general_helpers.py @@ -0,0 +1,32 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Helpers for general Python functionality.""" + +import functools + +import six + + +# functools.partial objects lack several attributes present on real function +# objects. In Python 2 wraps fails on this so use a restricted set instead. +_PARTIAL_VALID_ASSIGNMENTS = ("__doc__",) + + +def wraps(wrapped): + """A functools.wraps helper that handles partial objects on Python 2.""" + if isinstance(wrapped, functools.partial): + return six.wraps(wrapped, assigned=_PARTIAL_VALID_ASSIGNMENTS) + else: + return six.wraps(wrapped) diff --git a/venv/lib/python3.6/site-packages/google/api_core/grpc_helpers.py b/venv/lib/python3.6/site-packages/google/api_core/grpc_helpers.py new file mode 100644 index 0000000..4d63beb --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/grpc_helpers.py @@ -0,0 +1,384 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Helpers for :mod:`grpc`.""" + +import collections + +import grpc +import six + +from google.api_core import exceptions +from google.api_core import general_helpers +import google.auth +import google.auth.credentials +import google.auth.transport.grpc +import google.auth.transport.requests + +try: + import grpc_gcp + + HAS_GRPC_GCP = True +except ImportError: + HAS_GRPC_GCP = False + +# The list of gRPC Callable interfaces that return iterators. +_STREAM_WRAP_CLASSES = (grpc.UnaryStreamMultiCallable, grpc.StreamStreamMultiCallable) + + +def _patch_callable_name(callable_): + """Fix-up gRPC callable attributes. + + gRPC callable lack the ``__name__`` attribute which causes + :func:`functools.wraps` to error. This adds the attribute if needed. + """ + if not hasattr(callable_, "__name__"): + callable_.__name__ = callable_.__class__.__name__ + + +def _wrap_unary_errors(callable_): + """Map errors for Unary-Unary and Stream-Unary gRPC callables.""" + _patch_callable_name(callable_) + + @six.wraps(callable_) + def error_remapped_callable(*args, **kwargs): + try: + return callable_(*args, **kwargs) + except grpc.RpcError as exc: + six.raise_from(exceptions.from_grpc_error(exc), exc) + + return error_remapped_callable + + +class _StreamingResponseIterator(grpc.Call): + def __init__(self, wrapped): + self._wrapped = wrapped + + def __iter__(self): + """This iterator is also an iterable that returns itself.""" + return self + + def next(self): + """Get the next response from the stream. + + Returns: + protobuf.Message: A single response from the stream. + """ + try: + return six.next(self._wrapped) + except grpc.RpcError as exc: + six.raise_from(exceptions.from_grpc_error(exc), exc) + + # Alias needed for Python 2/3 support. + __next__ = next + + # grpc.Call & grpc.RpcContext interface + + def add_callback(self, callback): + return self._wrapped.add_callback(callback) + + def cancel(self): + return self._wrapped.cancel() + + def code(self): + return self._wrapped.code() + + def details(self): + return self._wrapped.details() + + def initial_metadata(self): + return self._wrapped.initial_metadata() + + def is_active(self): + return self._wrapped.is_active() + + def time_remaining(self): + return self._wrapped.time_remaining() + + def trailing_metadata(self): + return self._wrapped.trailing_metadata() + + +def _wrap_stream_errors(callable_): + """Wrap errors for Unary-Stream and Stream-Stream gRPC callables. + + The callables that return iterators require a bit more logic to re-map + errors when iterating. This wraps both the initial invocation and the + iterator of the return value to re-map errors. + """ + _patch_callable_name(callable_) + + @general_helpers.wraps(callable_) + def error_remapped_callable(*args, **kwargs): + try: + result = callable_(*args, **kwargs) + return _StreamingResponseIterator(result) + except grpc.RpcError as exc: + six.raise_from(exceptions.from_grpc_error(exc), exc) + + return error_remapped_callable + + +def wrap_errors(callable_): + """Wrap a gRPC callable and map :class:`grpc.RpcErrors` to friendly error + classes. + + Errors raised by the gRPC callable are mapped to the appropriate + :class:`google.api_core.exceptions.GoogleAPICallError` subclasses. + The original `grpc.RpcError` (which is usually also a `grpc.Call`) is + available from the ``response`` property on the mapped exception. This + is useful for extracting metadata from the original error. + + Args: + callable_ (Callable): A gRPC callable. + + Returns: + Callable: The wrapped gRPC callable. + """ + if isinstance(callable_, _STREAM_WRAP_CLASSES): + return _wrap_stream_errors(callable_) + else: + return _wrap_unary_errors(callable_) + + +def create_channel( + target, credentials=None, scopes=None, ssl_credentials=None, **kwargs +): + """Create a secure channel with credentials. + + Args: + target (str): The target service address in the format 'hostname:port'. + credentials (google.auth.credentials.Credentials): The credentials. If + not specified, then this function will attempt to ascertain the + credentials from the environment using :func:`google.auth.default`. + scopes (Sequence[str]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + ssl_credentials (grpc.ChannelCredentials): Optional SSL channel + credentials. This can be used to specify different certificates. + kwargs: Additional key-word args passed to + :func:`grpc_gcp.secure_channel` or :func:`grpc.secure_channel`. + + Returns: + grpc.Channel: The created channel. + """ + if credentials is None: + credentials, _ = google.auth.default(scopes=scopes) + else: + credentials = google.auth.credentials.with_scopes_if_required( + credentials, scopes + ) + + request = google.auth.transport.requests.Request() + + # Create the metadata plugin for inserting the authorization header. + metadata_plugin = google.auth.transport.grpc.AuthMetadataPlugin( + credentials, request + ) + + # Create a set of grpc.CallCredentials using the metadata plugin. + google_auth_credentials = grpc.metadata_call_credentials(metadata_plugin) + + if ssl_credentials is None: + ssl_credentials = grpc.ssl_channel_credentials() + + # Combine the ssl credentials and the authorization credentials. + composite_credentials = grpc.composite_channel_credentials( + ssl_credentials, google_auth_credentials + ) + + if HAS_GRPC_GCP: + # If grpc_gcp module is available use grpc_gcp.secure_channel, + # otherwise, use grpc.secure_channel to create grpc channel. + return grpc_gcp.secure_channel(target, composite_credentials, **kwargs) + else: + return grpc.secure_channel(target, composite_credentials, **kwargs) + + +_MethodCall = collections.namedtuple( + "_MethodCall", ("request", "timeout", "metadata", "credentials") +) + +_ChannelRequest = collections.namedtuple("_ChannelRequest", ("method", "request")) + + +class _CallableStub(object): + """Stub for the grpc.*MultiCallable interfaces.""" + + def __init__(self, method, channel): + self._method = method + self._channel = channel + self.response = None + """Union[protobuf.Message, Callable[protobuf.Message], exception]: + The response to give when invoking this callable. If this is a + callable, it will be invoked with the request protobuf. If it's an + exception, the exception will be raised when this is invoked. + """ + self.responses = None + """Iterator[ + Union[protobuf.Message, Callable[protobuf.Message], exception]]: + An iterator of responses. If specified, self.response will be populated + on each invocation by calling ``next(self.responses)``.""" + self.requests = [] + """List[protobuf.Message]: All requests sent to this callable.""" + self.calls = [] + """List[Tuple]: All invocations of this callable. Each tuple is the + request, timeout, metadata, and credentials.""" + + def __call__(self, request, timeout=None, metadata=None, credentials=None): + self._channel.requests.append(_ChannelRequest(self._method, request)) + self.calls.append(_MethodCall(request, timeout, metadata, credentials)) + self.requests.append(request) + + response = self.response + if self.responses is not None: + if response is None: + response = next(self.responses) + else: + raise ValueError( + "{method}.response and {method}.responses are mutually " + "exclusive.".format(method=self._method) + ) + + if callable(response): + return response(request) + + if isinstance(response, Exception): + raise response + + if response is not None: + return response + + raise ValueError('Method stub for "{}" has no response.'.format(self._method)) + + +def _simplify_method_name(method): + """Simplifies a gRPC method name. + + When gRPC invokes the channel to create a callable, it gives a full + method name like "/google.pubsub.v1.Publisher/CreateTopic". This + returns just the name of the method, in this case "CreateTopic". + + Args: + method (str): The name of the method. + + Returns: + str: The simplified name of the method. + """ + return method.rsplit("/", 1).pop() + + +class ChannelStub(grpc.Channel): + """A testing stub for the grpc.Channel interface. + + This can be used to test any client that eventually uses a gRPC channel + to communicate. By passing in a channel stub, you can configure which + responses are returned and track which requests are made. + + For example: + + .. code-block:: python + + channel_stub = grpc_helpers.ChannelStub() + client = FooClient(channel=channel_stub) + + channel_stub.GetFoo.response = foo_pb2.Foo(name='bar') + + foo = client.get_foo(labels=['baz']) + + assert foo.name == 'bar' + assert channel_stub.GetFoo.requests[0].labels = ['baz'] + + Each method on the stub can be accessed and configured on the channel. + Here's some examples of various configurations: + + .. code-block:: python + + # Return a basic response: + + channel_stub.GetFoo.response = foo_pb2.Foo(name='bar') + assert client.get_foo().name == 'bar' + + # Raise an exception: + channel_stub.GetFoo.response = NotFound('...') + + with pytest.raises(NotFound): + client.get_foo() + + # Use a sequence of responses: + channel_stub.GetFoo.responses = iter([ + foo_pb2.Foo(name='bar'), + foo_pb2.Foo(name='baz'), + ]) + + assert client.get_foo().name == 'bar' + assert client.get_foo().name == 'baz' + + # Use a callable + + def on_get_foo(request): + return foo_pb2.Foo(name='bar' + request.id) + + channel_stub.GetFoo.response = on_get_foo + + assert client.get_foo(id='123').name == 'bar123' + """ + + def __init__(self, responses=[]): + self.requests = [] + """Sequence[Tuple[str, protobuf.Message]]: A list of all requests made + on this channel in order. The tuple is of method name, request + message.""" + self._method_stubs = {} + + def _stub_for_method(self, method): + method = _simplify_method_name(method) + self._method_stubs[method] = _CallableStub(method, self) + return self._method_stubs[method] + + def __getattr__(self, key): + try: + return self._method_stubs[key] + except KeyError: + raise AttributeError + + def unary_unary(self, method, request_serializer=None, response_deserializer=None): + """grpc.Channel.unary_unary implementation.""" + return self._stub_for_method(method) + + def unary_stream(self, method, request_serializer=None, response_deserializer=None): + """grpc.Channel.unary_stream implementation.""" + return self._stub_for_method(method) + + def stream_unary(self, method, request_serializer=None, response_deserializer=None): + """grpc.Channel.stream_unary implementation.""" + return self._stub_for_method(method) + + def stream_stream( + self, method, request_serializer=None, response_deserializer=None + ): + """grpc.Channel.stream_stream implementation.""" + return self._stub_for_method(method) + + def subscribe(self, callback, try_to_connect=False): + """grpc.Channel.subscribe implementation.""" + pass + + def unsubscribe(self, callback): + """grpc.Channel.unsubscribe implementation.""" + pass + + def close(self): + """grpc.Channel.close implementation.""" + pass diff --git a/venv/lib/python3.6/site-packages/google/api_core/iam.py b/venv/lib/python3.6/site-packages/google/api_core/iam.py new file mode 100644 index 0000000..c17bddc --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/iam.py @@ -0,0 +1,248 @@ +# Copyright 2017 Google LLC +# +# 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. +"""Non-API-specific IAM policy definitions + +For allowed roles / permissions, see: +https://cloud.google.com/iam/docs/understanding-roles +""" + +import collections +try: + from collections import abc as collections_abc +except ImportError: # Python 2.7 + import collections as collections_abc +import warnings + +# Generic IAM roles + +OWNER_ROLE = "roles/owner" +"""Generic role implying all rights to an object.""" + +EDITOR_ROLE = "roles/editor" +"""Generic role implying rights to modify an object.""" + +VIEWER_ROLE = "roles/viewer" +"""Generic role implying rights to access an object.""" + +_ASSIGNMENT_DEPRECATED_MSG = """\ +Assigning to '{}' is deprecated. Replace with 'policy[{}] = members.""" + + +class Policy(collections_abc.MutableMapping): + """IAM Policy + + See + https://cloud.google.com/iam/reference/rest/v1/Policy + + :type etag: str + :param etag: ETag used to identify a unique of the policy + + :type version: int + :param version: unique version of the policy + """ + + _OWNER_ROLES = (OWNER_ROLE,) + """Roles mapped onto our ``owners`` attribute.""" + + _EDITOR_ROLES = (EDITOR_ROLE,) + """Roles mapped onto our ``editors`` attribute.""" + + _VIEWER_ROLES = (VIEWER_ROLE,) + """Roles mapped onto our ``viewers`` attribute.""" + + def __init__(self, etag=None, version=None): + self.etag = etag + self.version = version + self._bindings = collections.defaultdict(set) + + def __iter__(self): + return iter(self._bindings) + + def __len__(self): + return len(self._bindings) + + def __getitem__(self, key): + return self._bindings[key] + + def __setitem__(self, key, value): + self._bindings[key] = set(value) + + def __delitem__(self, key): + del self._bindings[key] + + @property + def owners(self): + """Legacy access to owner role.""" + result = set() + for role in self._OWNER_ROLES: + for member in self._bindings.get(role, ()): + result.add(member) + return frozenset(result) + + @owners.setter + def owners(self, value): + """Update owners.""" + warnings.warn( + _ASSIGNMENT_DEPRECATED_MSG.format("owners", OWNER_ROLE), DeprecationWarning + ) + self[OWNER_ROLE] = value + + @property + def editors(self): + """Legacy access to editor role.""" + result = set() + for role in self._EDITOR_ROLES: + for member in self._bindings.get(role, ()): + result.add(member) + return frozenset(result) + + @editors.setter + def editors(self, value): + """Update editors.""" + warnings.warn( + _ASSIGNMENT_DEPRECATED_MSG.format("editors", EDITOR_ROLE), + DeprecationWarning, + ) + self[EDITOR_ROLE] = value + + @property + def viewers(self): + """Legacy access to viewer role.""" + result = set() + for role in self._VIEWER_ROLES: + for member in self._bindings.get(role, ()): + result.add(member) + return frozenset(result) + + @viewers.setter + def viewers(self, value): + """Update viewers.""" + warnings.warn( + _ASSIGNMENT_DEPRECATED_MSG.format("viewers", VIEWER_ROLE), + DeprecationWarning, + ) + self[VIEWER_ROLE] = value + + @staticmethod + def user(email): + """Factory method for a user member. + + :type email: str + :param email: E-mail for this particular user. + + :rtype: str + :returns: A member string corresponding to the given user. + """ + return "user:%s" % (email,) + + @staticmethod + def service_account(email): + """Factory method for a service account member. + + :type email: str + :param email: E-mail for this particular service account. + + :rtype: str + :returns: A member string corresponding to the given service account. + """ + return "serviceAccount:%s" % (email,) + + @staticmethod + def group(email): + """Factory method for a group member. + + :type email: str + :param email: An id or e-mail for this particular group. + + :rtype: str + :returns: A member string corresponding to the given group. + """ + return "group:%s" % (email,) + + @staticmethod + def domain(domain): + """Factory method for a domain member. + + :type domain: str + :param domain: The domain for this member. + + :rtype: str + :returns: A member string corresponding to the given domain. + """ + return "domain:%s" % (domain,) + + @staticmethod + def all_users(): + """Factory method for a member representing all users. + + :rtype: str + :returns: A member string representing all users. + """ + return "allUsers" + + @staticmethod + def authenticated_users(): + """Factory method for a member representing all authenticated users. + + :rtype: str + :returns: A member string representing all authenticated users. + """ + return "allAuthenticatedUsers" + + @classmethod + def from_api_repr(cls, resource): + """Create a policy from the resource returned from the API. + + :type resource: dict + :param resource: resource returned from the ``getIamPolicy`` API. + + :rtype: :class:`Policy` + :returns: the parsed policy + """ + version = resource.get("version") + etag = resource.get("etag") + policy = cls(etag, version) + for binding in resource.get("bindings", ()): + role = binding["role"] + members = sorted(binding["members"]) + policy[role] = members + return policy + + def to_api_repr(self): + """Construct a Policy resource. + + :rtype: dict + :returns: a resource to be passed to the ``setIamPolicy`` API. + """ + resource = {} + + if self.etag is not None: + resource["etag"] = self.etag + + if self.version is not None: + resource["version"] = self.version + + if self._bindings: + bindings = resource["bindings"] = [] + for role, members in sorted(self._bindings.items()): + if members: + bindings.append({"role": role, "members": sorted(set(members))}) + + if not bindings: + del resource["bindings"] + + return resource + + +collections_abc.MutableMapping.register(Policy) diff --git a/venv/lib/python3.6/site-packages/google/api_core/operation.py b/venv/lib/python3.6/site-packages/google/api_core/operation.py new file mode 100644 index 0000000..4147c7b --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/operation.py @@ -0,0 +1,308 @@ +# Copyright 2016 Google LLC +# +# 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. + +"""Futures for long-running operations returned from Google Cloud APIs. + +These futures can be used to synchronously wait for the result of a +long-running operation using :meth:`Operation.result`: + + +.. code-block:: python + + operation = my_api_client.long_running_method() + result = operation.result() + +Or asynchronously using callbacks and :meth:`Operation.add_done_callback`: + +.. code-block:: python + + operation = my_api_client.long_running_method() + + def my_callback(future): + result = future.result() + + operation.add_done_callback(my_callback) + +""" + +import functools +import threading + +from google.api_core import exceptions +from google.api_core import protobuf_helpers +from google.api_core.future import polling +from google.longrunning import operations_pb2 +from google.protobuf import json_format +from google.rpc import code_pb2 + + +class Operation(polling.PollingFuture): + """A Future for interacting with a Google API Long-Running Operation. + + Args: + operation (google.longrunning.operations_pb2.Operation): The + initial operation. + refresh (Callable[[], ~.api_core.operation.Operation]): A callable that + returns the latest state of the operation. + cancel (Callable[[], None]): A callable that tries to cancel + the operation. + result_type (func:`type`): The protobuf type for the operation's + result. + metadata_type (func:`type`): The protobuf type for the operation's + metadata. + retry (google.api_core.retry.Retry): The retry configuration used + when polling. This can be used to control how often :meth:`done` + is polled. Regardless of the retry's ``deadline``, it will be + overridden by the ``timeout`` argument to :meth:`result`. + """ + + def __init__( + self, + operation, + refresh, + cancel, + result_type, + metadata_type=None, + retry=polling.DEFAULT_RETRY, + ): + super(Operation, self).__init__(retry=retry) + self._operation = operation + self._refresh = refresh + self._cancel = cancel + self._result_type = result_type + self._metadata_type = metadata_type + self._completion_lock = threading.Lock() + # Invoke this in case the operation came back already complete. + self._set_result_from_operation() + + @property + def operation(self): + """google.longrunning.Operation: The current long-running operation.""" + return self._operation + + @property + def metadata(self): + """google.protobuf.Message: the current operation metadata.""" + if not self._operation.HasField("metadata"): + return None + + return protobuf_helpers.from_any_pb( + self._metadata_type, self._operation.metadata + ) + + def _set_result_from_operation(self): + """Set the result or exception from the operation if it is complete.""" + # This must be done in a lock to prevent the polling thread + # and main thread from both executing the completion logic + # at the same time. + with self._completion_lock: + # If the operation isn't complete or if the result has already been + # set, do not call set_result/set_exception again. + # Note: self._result_set is set to True in set_result and + # set_exception, in case those methods are invoked directly. + if not self._operation.done or self._result_set: + return + + if self._operation.HasField("response"): + response = protobuf_helpers.from_any_pb( + self._result_type, self._operation.response + ) + self.set_result(response) + elif self._operation.HasField("error"): + exception = exceptions.GoogleAPICallError( + self._operation.error.message, + errors=(self._operation.error,), + response=self._operation, + ) + self.set_exception(exception) + else: + exception = exceptions.GoogleAPICallError( + "Unexpected state: Long-running operation had neither " + "response nor error set." + ) + self.set_exception(exception) + + def _refresh_and_update(self): + """Refresh the operation and update the result if needed.""" + # If the currently cached operation is done, no need to make another + # RPC as it will not change once done. + if not self._operation.done: + self._operation = self._refresh() + self._set_result_from_operation() + + def done(self): + """Checks to see if the operation is complete. + + Returns: + bool: True if the operation is complete, False otherwise. + """ + self._refresh_and_update() + return self._operation.done + + def cancel(self): + """Attempt to cancel the operation. + + Returns: + bool: True if the cancel RPC was made, False if the operation is + already complete. + """ + if self.done(): + return False + + self._cancel() + return True + + def cancelled(self): + """True if the operation was cancelled.""" + self._refresh_and_update() + return ( + self._operation.HasField("error") + and self._operation.error.code == code_pb2.CANCELLED + ) + + +def _refresh_http(api_request, operation_name): + """Refresh an operation using a JSON/HTTP client. + + Args: + api_request (Callable): A callable used to make an API request. This + should generally be + :meth:`google.cloud._http.Connection.api_request`. + operation_name (str): The name of the operation. + + Returns: + google.longrunning.operations_pb2.Operation: The operation. + """ + path = "operations/{}".format(operation_name) + api_response = api_request(method="GET", path=path) + return json_format.ParseDict(api_response, operations_pb2.Operation()) + + +def _cancel_http(api_request, operation_name): + """Cancel an operation using a JSON/HTTP client. + + Args: + api_request (Callable): A callable used to make an API request. This + should generally be + :meth:`google.cloud._http.Connection.api_request`. + operation_name (str): The name of the operation. + """ + path = "operations/{}:cancel".format(operation_name) + api_request(method="POST", path=path) + + +def from_http_json(operation, api_request, result_type, **kwargs): + """Create an operation future using a HTTP/JSON client. + + This interacts with the long-running operations `service`_ (specific + to a given API) via `HTTP/JSON`_. + + .. _HTTP/JSON: https://cloud.google.com/speech/reference/rest/\ + v1beta1/operations#Operation + + Args: + operation (dict): Operation as a dictionary. + api_request (Callable): A callable used to make an API request. This + should generally be + :meth:`google.cloud._http.Connection.api_request`. + result_type (:func:`type`): The protobuf result type. + kwargs: Keyword args passed into the :class:`Operation` constructor. + + Returns: + ~.api_core.operation.Operation: The operation future to track the given + operation. + """ + operation_proto = json_format.ParseDict(operation, operations_pb2.Operation()) + refresh = functools.partial(_refresh_http, api_request, operation_proto.name) + cancel = functools.partial(_cancel_http, api_request, operation_proto.name) + return Operation(operation_proto, refresh, cancel, result_type, **kwargs) + + +def _refresh_grpc(operations_stub, operation_name): + """Refresh an operation using a gRPC client. + + Args: + operations_stub (google.longrunning.operations_pb2.OperationsStub): + The gRPC operations stub. + operation_name (str): The name of the operation. + + Returns: + google.longrunning.operations_pb2.Operation: The operation. + """ + request_pb = operations_pb2.GetOperationRequest(name=operation_name) + return operations_stub.GetOperation(request_pb) + + +def _cancel_grpc(operations_stub, operation_name): + """Cancel an operation using a gRPC client. + + Args: + operations_stub (google.longrunning.operations_pb2.OperationsStub): + The gRPC operations stub. + operation_name (str): The name of the operation. + """ + request_pb = operations_pb2.CancelOperationRequest(name=operation_name) + operations_stub.CancelOperation(request_pb) + + +def from_grpc(operation, operations_stub, result_type, **kwargs): + """Create an operation future using a gRPC client. + + This interacts with the long-running operations `service`_ (specific + to a given API) via gRPC. + + .. _service: https://github.com/googleapis/googleapis/blob/\ + 050400df0fdb16f63b63e9dee53819044bffc857/\ + google/longrunning/operations.proto#L38 + + Args: + operation (google.longrunning.operations_pb2.Operation): The operation. + operations_stub (google.longrunning.operations_pb2.OperationsStub): + The operations stub. + result_type (:func:`type`): The protobuf result type. + kwargs: Keyword args passed into the :class:`Operation` constructor. + + Returns: + ~.api_core.operation.Operation: The operation future to track the given + operation. + """ + refresh = functools.partial(_refresh_grpc, operations_stub, operation.name) + cancel = functools.partial(_cancel_grpc, operations_stub, operation.name) + return Operation(operation, refresh, cancel, result_type, **kwargs) + + +def from_gapic(operation, operations_client, result_type, **kwargs): + """Create an operation future from a gapic client. + + This interacts with the long-running operations `service`_ (specific + to a given API) via a gapic client. + + .. _service: https://github.com/googleapis/googleapis/blob/\ + 050400df0fdb16f63b63e9dee53819044bffc857/\ + google/longrunning/operations.proto#L38 + + Args: + operation (google.longrunning.operations_pb2.Operation): The operation. + operations_client (google.api_core.operations_v1.OperationsClient): + The operations client. + result_type (:func:`type`): The protobuf result type. + kwargs: Keyword args passed into the :class:`Operation` constructor. + + Returns: + ~.api_core.operation.Operation: The operation future to track the given + operation. + """ + refresh = functools.partial(operations_client.get_operation, operation.name) + cancel = functools.partial(operations_client.cancel_operation, operation.name) + return Operation(operation, refresh, cancel, result_type, **kwargs) diff --git a/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__init__.py b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__init__.py new file mode 100644 index 0000000..f054956 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Package for interacting with the google.longrunning.operations meta-API.""" + +from google.api_core.operations_v1.operations_client import OperationsClient + +__all__ = ["OperationsClient"] diff --git a/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/__init__.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a4043c78fdf2cb026dda1d7b36f2931f702c755 GIT binary patch literal 363 zcmYk1!Ait16h+fa2SsMowX1BqXv64ML~)}VXT)6*9Ua>COaluchR zR;+qpQjmM=i84WWRt04wc~)Uf!deh%t<<8>)=1wP6SKm)cr7Sv8d8hE^0U=t@fk@d zOS=8#e|WByFv0hqxysUR3xL}Sprk`3a|$Z!#i$RS7Gqa!8v5r4l5SRrND82g3IK(B>9&t+%Udl@_9CT8qojC- Fe*h^tZp8oq literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/operations_client.cpython-36.pyc b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/__pycache__/operations_client.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bda2366cfbe0c111978a97da82dbc743e0ac0462 GIT binary patch literal 11392 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 Fe*v*aB8dP1 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client.py b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client.py new file mode 100644 index 0000000..cd2923b --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client.py @@ -0,0 +1,288 @@ +# Copyright 2017 Google LLC +# +# 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 client for the google.longrunning.operations meta-API. + +This is a client that deals with long-running operations that follow the +pattern outlined by the `Google API Style Guide`_. + +When an API method normally takes long time to complete, it can be designed to +return ``Operation`` to the client, and the client can use this interface to +receive the real response asynchronously by polling the operation resource to +receive the response. + +It is not a separate service, but rather an interface implemented by a larger +service. The protocol-level definition is available at +`google/longrunning/operations.proto`_. Typically, this will be constructed +automatically by another client class to deal with operations. + +.. _Google API Style Guide: + https://cloud.google.com/apis/design/design_pattern + s#long_running_operations +.. _google/longrunning/operations.proto: + https://github.com/googleapis/googleapis/blob/master/google/longrunning + /operations.proto +""" + +import functools + +from google.api_core import gapic_v1 +from google.api_core import page_iterator +from google.api_core.operations_v1 import operations_client_config +from google.longrunning import operations_pb2 + + +class OperationsClient(object): + """Client for interacting with long-running operations within a service. + + Args: + channel (grpc.Channel): The gRPC channel associated with the service + that implements the ``google.longrunning.operations`` interface. + client_config (dict): + A dictionary of call options for each method. If not specified + the default configuration is used. + """ + + def __init__(self, channel, client_config=operations_client_config.config): + # Create the gRPC client stub. + self.operations_stub = operations_pb2.OperationsStub(channel) + + # Create all wrapped methods using the interface configuration. + # The interface config contains all of the default settings for retry + # and timeout for each RPC method. + interfaces = client_config["interfaces"] + interface_config = interfaces["google.longrunning.Operations"] + method_configs = gapic_v1.config.parse_method_configs(interface_config) + + self._get_operation = gapic_v1.method.wrap_method( + self.operations_stub.GetOperation, + default_retry=method_configs["GetOperation"].retry, + default_timeout=method_configs["GetOperation"].timeout, + ) + + self._list_operations = gapic_v1.method.wrap_method( + self.operations_stub.ListOperations, + default_retry=method_configs["ListOperations"].retry, + default_timeout=method_configs["ListOperations"].timeout, + ) + + self._cancel_operation = gapic_v1.method.wrap_method( + self.operations_stub.CancelOperation, + default_retry=method_configs["CancelOperation"].retry, + default_timeout=method_configs["CancelOperation"].timeout, + ) + + self._delete_operation = gapic_v1.method.wrap_method( + self.operations_stub.DeleteOperation, + default_retry=method_configs["DeleteOperation"].retry, + default_timeout=method_configs["DeleteOperation"].timeout, + ) + + # Service calls + def get_operation( + self, name, retry=gapic_v1.method.DEFAULT, timeout=gapic_v1.method.DEFAULT + ): + """Gets the latest state of a long-running operation. + + Clients can use this method to poll the operation result at intervals + as recommended by the API service. + + Example: + >>> from google.api_core import operations_v1 + >>> api = operations_v1.OperationsClient() + >>> name = '' + >>> response = api.get_operation(name) + + Args: + name (str): The name of the operation resource. + retry (google.api_core.retry.Retry): The retry strategy to use + when invoking the RPC. If unspecified, the default retry from + the client configuration will be used. If ``None``, then this + method will not retry the RPC at all. + timeout (float): The amount of time in seconds to wait for the RPC + to complete. Note that if ``retry`` is used, this timeout + applies to each individual attempt and the overall time it + takes for this method to complete may be longer. If + unspecified, the the default timeout in the client + configuration is used. If ``None``, then the RPC method will + not time out. + + Returns: + google.longrunning.operations_pb2.Operation: The state of the + operation. + + Raises: + google.api_core.exceptions.GoogleAPICallError: If an error occurred + while invoking the RPC, the appropriate ``GoogleAPICallError`` + subclass will be raised. + """ + request = operations_pb2.GetOperationRequest(name=name) + return self._get_operation(request, retry=retry, timeout=timeout) + + def list_operations( + self, + name, + filter_, + retry=gapic_v1.method.DEFAULT, + timeout=gapic_v1.method.DEFAULT, + ): + """ + Lists operations that match the specified filter in the request. + + Example: + >>> from google.api_core import operations_v1 + >>> api = operations_v1.OperationsClient() + >>> name = '' + >>> + >>> # Iterate over all results + >>> for operation in api.list_operations(name): + >>> # process operation + >>> pass + >>> + >>> # Or iterate over results one page at a time + >>> iter = api.list_operations(name) + >>> for page in iter.pages: + >>> for operation in page: + >>> # process operation + >>> pass + + Args: + name (str): The name of the operation collection. + filter_ (str): The standard list filter. + retry (google.api_core.retry.Retry): The retry strategy to use + when invoking the RPC. If unspecified, the default retry from + the client configuration will be used. If ``None``, then this + method will not retry the RPC at all. + timeout (float): The amount of time in seconds to wait for the RPC + to complete. Note that if ``retry`` is used, this timeout + applies to each individual attempt and the overall time it + takes for this method to complete may be longer. If + unspecified, the the default timeout in the client + configuration is used. If ``None``, then the RPC method will + not time out. + + Returns: + google.api_core.page_iterator.Iterator: An iterator that yields + :class:`google.longrunning.operations_pb2.Operation` instances. + + Raises: + google.api_core.exceptions.MethodNotImplemented: If the server + does not support this method. Services are not required to + implement this method. + google.api_core.exceptions.GoogleAPICallError: If an error occurred + while invoking the RPC, the appropriate ``GoogleAPICallError`` + subclass will be raised. + """ + # Create the request object. + request = operations_pb2.ListOperationsRequest(name=name, filter=filter_) + + # Create the method used to fetch pages + method = functools.partial(self._list_operations, retry=retry, timeout=timeout) + + iterator = page_iterator.GRPCIterator( + client=None, + method=method, + request=request, + items_field="operations", + request_token_field="page_token", + response_token_field="next_page_token", + ) + + return iterator + + def cancel_operation( + self, name, retry=gapic_v1.method.DEFAULT, timeout=gapic_v1.method.DEFAULT + ): + """Starts asynchronous cancellation on a long-running operation. + + The server makes a best effort to cancel the operation, but success is + not guaranteed. Clients can use :meth:`get_operation` or service- + specific methods to check whether the cancellation succeeded or whether + the operation completed despite cancellation. On successful + cancellation, the operation is not deleted; instead, it becomes an + operation with an ``Operation.error`` value with a + ``google.rpc.Status.code`` of ``1``, corresponding to + ``Code.CANCELLED``. + + Example: + >>> from google.api_core import operations_v1 + >>> api = operations_v1.OperationsClient() + >>> name = '' + >>> api.cancel_operation(name) + + Args: + name (str): The name of the operation resource to be cancelled. + retry (google.api_core.retry.Retry): The retry strategy to use + when invoking the RPC. If unspecified, the default retry from + the client configuration will be used. If ``None``, then this + method will not retry the RPC at all. + timeout (float): The amount of time in seconds to wait for the RPC + to complete. Note that if ``retry`` is used, this timeout + applies to each individual attempt and the overall time it + takes for this method to complete may be longer. If + unspecified, the the default timeout in the client + configuration is used. If ``None``, then the RPC method will + not time out. + + Raises: + google.api_core.exceptions.MethodNotImplemented: If the server + does not support this method. Services are not required to + implement this method. + google.api_core.exceptions.GoogleAPICallError: If an error occurred + while invoking the RPC, the appropriate ``GoogleAPICallError`` + subclass will be raised. + """ + # Create the request object. + request = operations_pb2.CancelOperationRequest(name=name) + self._cancel_operation(request, retry=retry, timeout=timeout) + + def delete_operation( + self, name, retry=gapic_v1.method.DEFAULT, timeout=gapic_v1.method.DEFAULT + ): + """Deletes a long-running operation. + + This method indicates that the client is no longer interested in the + operation result. It does not cancel the operation. + + Example: + >>> from google.api_core import operations_v1 + >>> api = operations_v1.OperationsClient() + >>> name = '' + >>> api.delete_operation(name) + + Args: + name (str): The name of the operation resource to be deleted. + retry (google.api_core.retry.Retry): The retry strategy to use + when invoking the RPC. If unspecified, the default retry from + the client configuration will be used. If ``None``, then this + method will not retry the RPC at all. + timeout (float): The amount of time in seconds to wait for the RPC + to complete. Note that if ``retry`` is used, this timeout + applies to each individual attempt and the overall time it + takes for this method to complete may be longer. If + unspecified, the the default timeout in the client + configuration is used. If ``None``, then the RPC method will + not time out. + + Raises: + google.api_core.exceptions.MethodNotImplemented: If the server + does not support this method. Services are not required to + implement this method. + google.api_core.exceptions.GoogleAPICallError: If an error occurred + while invoking the RPC, the appropriate ``GoogleAPICallError`` + subclass will be raised. + """ + # Create the request object. + request = operations_pb2.DeleteOperationRequest(name=name) + self._delete_operation(request, retry=retry, timeout=timeout) diff --git a/venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client_config.py b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client_config.py new file mode 100644 index 0000000..6cf9575 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/operations_v1/operations_client_config.py @@ -0,0 +1,59 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""gapic configuration for the googe.longrunning.operations client.""" + +config = { + "interfaces": { + "google.longrunning.Operations": { + "retry_codes": { + "idempotent": ["DEADLINE_EXCEEDED", "UNAVAILABLE"], + "non_idempotent": [], + }, + "retry_params": { + "default": { + "initial_retry_delay_millis": 100, + "retry_delay_multiplier": 1.3, + "max_retry_delay_millis": 60000, + "initial_rpc_timeout_millis": 20000, + "rpc_timeout_multiplier": 1.0, + "max_rpc_timeout_millis": 600000, + "total_timeout_millis": 600000, + } + }, + "methods": { + "GetOperation": { + "timeout_millis": 60000, + "retry_codes_name": "idempotent", + "retry_params_name": "default", + }, + "ListOperations": { + "timeout_millis": 60000, + "retry_codes_name": "idempotent", + "retry_params_name": "default", + }, + "CancelOperation": { + "timeout_millis": 60000, + "retry_codes_name": "idempotent", + "retry_params_name": "default", + }, + "DeleteOperation": { + "timeout_millis": 60000, + "retry_codes_name": "idempotent", + "retry_params_name": "default", + }, + }, + } + } +} diff --git a/venv/lib/python3.6/site-packages/google/api_core/page_iterator.py b/venv/lib/python3.6/site-packages/google/api_core/page_iterator.py new file mode 100644 index 0000000..3ac5904 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/page_iterator.py @@ -0,0 +1,549 @@ +# Copyright 2015 Google LLC +# +# 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. + +"""Iterators for paging through paged API methods. + +These iterators simplify the process of paging through API responses +where the request takes a page token and the response is a list of results with +a token for the next page. See `list pagination`_ in the Google API Style Guide +for more details. + +.. _list pagination: + https://cloud.google.com/apis/design/design_patterns#list_pagination + +API clients that have methods that follow the list pagination pattern can +return an :class:`.Iterator`. You can use this iterator to get **all** of +the results across all pages:: + + >>> results_iterator = client.list_resources() + >>> list(results_iterator) # Convert to a list (consumes all values). + +Or you can walk your way through items and call off the search early if +you find what you're looking for (resulting in possibly fewer requests):: + + >>> for resource in results_iterator: + ... print(resource.name) + ... if not resource.is_valid: + ... break + +At any point, you may check the number of items consumed by referencing the +``num_results`` property of the iterator:: + + >>> for my_item in results_iterator: + ... if results_iterator.num_results >= 10: + ... break + +When iterating, not every new item will send a request to the server. +To iterate based on each page of items (where a page corresponds to +a request):: + + >>> for page in results_iterator.pages: + ... print('=' * 20) + ... print(' Page number: {:d}'.format(iterator.page_number)) + ... print(' Items in page: {:d}'.format(page.num_items)) + ... print(' First item: {!r}'.format(next(page))) + ... print('Items remaining: {:d}'.format(page.remaining)) + ... print('Next page token: {}'.format(iterator.next_page_token)) + ==================== + Page number: 1 + Items in page: 1 + First item: + Items remaining: 0 + Next page token: eav1OzQB0OM8rLdGXOEsyQWSG + ==================== + Page number: 2 + Items in page: 19 + First item: + Items remaining: 18 + Next page token: None + +Then, for each page you can get all the resources on that page by iterating +through it or using :func:`list`:: + + >>> list(page) + [ + , + , + , + ] +""" + +import abc + +import six + + +class Page(object): + """Single page of results in an iterator. + + Args: + parent (google.api_core.page_iterator.Iterator): The iterator that owns + the current page. + items (Sequence[Any]): An iterable (that also defines __len__) of items + from a raw API response. + item_to_value (Callable[google.api_core.page_iterator.Iterator, Any]): + Callable to convert an item from the type in the raw API response + into the native object. Will be called with the iterator and a + single item. + """ + + def __init__(self, parent, items, item_to_value): + self._parent = parent + self._num_items = len(items) + self._remaining = self._num_items + self._item_iter = iter(items) + self._item_to_value = item_to_value + + @property + def num_items(self): + """int: Total items in the page.""" + return self._num_items + + @property + def remaining(self): + """int: Remaining items in the page.""" + return self._remaining + + def __iter__(self): + """The :class:`Page` is an iterator of items.""" + return self + + def next(self): + """Get the next value in the page.""" + item = six.next(self._item_iter) + result = self._item_to_value(self._parent, item) + # Since we've successfully got the next value from the + # iterator, we update the number of remaining. + self._remaining -= 1 + return result + + # Alias needed for Python 2/3 support. + __next__ = next + + +def _item_to_value_identity(iterator, item): + """An item to value transformer that returns the item un-changed.""" + # pylint: disable=unused-argument + # We are conforming to the interface defined by Iterator. + return item + + +@six.add_metaclass(abc.ABCMeta) +class Iterator(object): + """A generic class for iterating through API list responses. + + Args: + client(google.cloud.client.Client): The API client. + item_to_value (Callable[google.api_core.page_iterator.Iterator, Any]): + Callable to convert an item from the type in the raw API response + into the native object. Will be called with the iterator and a + single item. + page_token (str): A token identifying a page in a result set to start + fetching results from. + max_results (int): The maximum number of results to fetch. + """ + + def __init__( + self, + client, + item_to_value=_item_to_value_identity, + page_token=None, + max_results=None, + ): + self._started = False + self.client = client + """Optional[Any]: The client that created this iterator.""" + self.item_to_value = item_to_value + """Callable[Iterator, Any]: Callable to convert an item from the type + in the raw API response into the native object. Will be called with + the iterator and a + single item. + """ + self.max_results = max_results + """int: The maximum number of results to fetch.""" + + # The attributes below will change over the life of the iterator. + self.page_number = 0 + """int: The current page of results.""" + self.next_page_token = page_token + """str: The token for the next page of results. If this is set before + the iterator starts, it effectively offsets the iterator to a + specific starting point.""" + self.num_results = 0 + """int: The total number of results fetched so far.""" + + @property + def pages(self): + """Iterator of pages in the response. + + returns: + types.GeneratorType[google.api_core.page_iterator.Page]: A + generator of page instances. + + raises: + ValueError: If the iterator has already been started. + """ + if self._started: + raise ValueError("Iterator has already started", self) + self._started = True + return self._page_iter(increment=True) + + def _items_iter(self): + """Iterator for each item returned.""" + for page in self._page_iter(increment=False): + for item in page: + self.num_results += 1 + yield item + + def __iter__(self): + """Iterator for each item returned. + + Returns: + types.GeneratorType[Any]: A generator of items from the API. + + Raises: + ValueError: If the iterator has already been started. + """ + if self._started: + raise ValueError("Iterator has already started", self) + self._started = True + return self._items_iter() + + def _page_iter(self, increment): + """Generator of pages of API responses. + + Args: + increment (bool): Flag indicating if the total number of results + should be incremented on each page. This is useful since a page + iterator will want to increment by results per page while an + items iterator will want to increment per item. + + Yields: + Page: each page of items from the API. + """ + page = self._next_page() + while page is not None: + self.page_number += 1 + if increment: + self.num_results += page.num_items + yield page + page = self._next_page() + + @abc.abstractmethod + def _next_page(self): + """Get the next page in the iterator. + + This does nothing and is intended to be over-ridden by subclasses + to return the next :class:`Page`. + + Raises: + NotImplementedError: Always, this method is abstract. + """ + raise NotImplementedError + + +def _do_nothing_page_start(iterator, page, response): + """Helper to provide custom behavior after a :class:`Page` is started. + + This is a do-nothing stand-in as the default value. + + Args: + iterator (Iterator): An iterator that holds some request info. + page (Page): The page that was just created. + response (Any): The API response for a page. + """ + # pylint: disable=unused-argument + pass + + +class HTTPIterator(Iterator): + """A generic class for iterating through HTTP/JSON API list responses. + + To make an iterator work, you'll need to provide a way to convert a JSON + item returned from the API into the object of your choice (via + ``item_to_value``). You also may need to specify a custom ``items_key`` so + that a given response (containing a page of results) can be parsed into an + iterable page of the actual objects you want. + + Args: + client (google.cloud.client.Client): The API client. + api_request (Callable): The function to use to make API requests. + Generally, this will be + :meth:`google.cloud._http.JSONConnection.api_request`. + path (str): The method path to query for the list of items. + item_to_value (Callable[google.api_core.page_iterator.Iterator, Any]): + Callable to convert an item from the type in the JSON response into + a native object. Will be called with the iterator and a single + item. + items_key (str): The key in the API response where the list of items + can be found. + page_token (str): A token identifying a page in a result set to start + fetching results from. + max_results (int): The maximum number of results to fetch. + extra_params (dict): Extra query string parameters for the + API call. + page_start (Callable[ + google.api_core.page_iterator.Iterator, + google.api_core.page_iterator.Page, dict]): Callable to provide + any special behavior after a new page has been created. Assumed + signature takes the :class:`.Iterator` that started the page, + the :class:`.Page` that was started and the dictionary containing + the page response. + next_token (str): The name of the field used in the response for page + tokens. + + .. autoattribute:: pages + """ + + _DEFAULT_ITEMS_KEY = "items" + _PAGE_TOKEN = "pageToken" + _MAX_RESULTS = "maxResults" + _NEXT_TOKEN = "nextPageToken" + _RESERVED_PARAMS = frozenset([_PAGE_TOKEN]) + _HTTP_METHOD = "GET" + + def __init__( + self, + client, + api_request, + path, + item_to_value, + items_key=_DEFAULT_ITEMS_KEY, + page_token=None, + max_results=None, + extra_params=None, + page_start=_do_nothing_page_start, + next_token=_NEXT_TOKEN, + ): + super(HTTPIterator, self).__init__( + client, item_to_value, page_token=page_token, max_results=max_results + ) + self.api_request = api_request + self.path = path + self._items_key = items_key + self.extra_params = extra_params + self._page_start = page_start + self._next_token = next_token + # Verify inputs / provide defaults. + if self.extra_params is None: + self.extra_params = {} + self._verify_params() + + def _verify_params(self): + """Verifies the parameters don't use any reserved parameter. + + Raises: + ValueError: If a reserved parameter is used. + """ + reserved_in_use = self._RESERVED_PARAMS.intersection(self.extra_params) + if reserved_in_use: + raise ValueError("Using a reserved parameter", reserved_in_use) + + def _next_page(self): + """Get the next page in the iterator. + + Returns: + Optional[Page]: The next page in the iterator or :data:`None` if + there are no pages left. + """ + if self._has_next_page(): + response = self._get_next_page_response() + items = response.get(self._items_key, ()) + page = Page(self, items, self.item_to_value) + self._page_start(self, page, response) + self.next_page_token = response.get(self._next_token) + return page + else: + return None + + def _has_next_page(self): + """Determines whether or not there are more pages with results. + + Returns: + bool: Whether the iterator has more pages. + """ + if self.page_number == 0: + return True + + if self.max_results is not None: + if self.num_results >= self.max_results: + return False + + return self.next_page_token is not None + + def _get_query_params(self): + """Getter for query parameters for the next request. + + Returns: + dict: A dictionary of query parameters. + """ + result = {} + if self.next_page_token is not None: + result[self._PAGE_TOKEN] = self.next_page_token + if self.max_results is not None: + result[self._MAX_RESULTS] = self.max_results - self.num_results + result.update(self.extra_params) + return result + + def _get_next_page_response(self): + """Requests the next page from the path provided. + + Returns: + dict: The parsed JSON response of the next page's contents. + + Raises: + ValueError: If the HTTP method is not ``GET`` or ``POST``. + """ + params = self._get_query_params() + if self._HTTP_METHOD == "GET": + return self.api_request( + method=self._HTTP_METHOD, path=self.path, query_params=params + ) + elif self._HTTP_METHOD == "POST": + return self.api_request( + method=self._HTTP_METHOD, path=self.path, data=params + ) + else: + raise ValueError("Unexpected HTTP method", self._HTTP_METHOD) + + +class _GAXIterator(Iterator): + """A generic class for iterating through Cloud gRPC APIs list responses. + + Any: + client (google.cloud.client.Client): The API client. + page_iter (google.gax.PageIterator): A GAX page iterator to be wrapped + to conform to the :class:`Iterator` interface. + item_to_value (Callable[Iterator, Any]): Callable to convert an item + from the the protobuf response into a native object. Will + be called with the iterator and a single item. + max_results (int): The maximum number of results to fetch. + + .. autoattribute:: pages + """ + + def __init__(self, client, page_iter, item_to_value, max_results=None): + super(_GAXIterator, self).__init__( + client, + item_to_value, + page_token=page_iter.page_token, + max_results=max_results, + ) + self._gax_page_iter = page_iter + + def _next_page(self): + """Get the next page in the iterator. + + Wraps the response from the :class:`~google.gax.PageIterator` in a + :class:`Page` instance and captures some state at each page. + + Returns: + Optional[Page]: The next page in the iterator or :data:`None` if + there are no pages left. + """ + try: + items = six.next(self._gax_page_iter) + page = Page(self, items, self.item_to_value) + self.next_page_token = self._gax_page_iter.page_token or None + return page + except StopIteration: + return None + + +class GRPCIterator(Iterator): + """A generic class for iterating through gRPC list responses. + + .. note:: The class does not take a ``page_token`` argument because it can + just be specified in the ``request``. + + Args: + client (google.cloud.client.Client): The API client. This unused by + this class, but kept to satisfy the :class:`Iterator` interface. + method (Callable[protobuf.Message]): A bound gRPC method that should + take a single message for the request. + request (protobuf.Message): The request message. + items_field (str): The field in the response message that has the + items for the page. + item_to_value (Callable[GRPCIterator, Any]): Callable to convert an + item from the type in the JSON response into a native object. Will + be called with the iterator and a single item. + request_token_field (str): The field in the request message used to + specify the page token. + response_token_field (str): The field in the response message that has + the token for the next page. + max_results (int): The maximum number of results to fetch. + + .. autoattribute:: pages + """ + + _DEFAULT_REQUEST_TOKEN_FIELD = "page_token" + _DEFAULT_RESPONSE_TOKEN_FIELD = "next_page_token" + + def __init__( + self, + client, + method, + request, + items_field, + item_to_value=_item_to_value_identity, + request_token_field=_DEFAULT_REQUEST_TOKEN_FIELD, + response_token_field=_DEFAULT_RESPONSE_TOKEN_FIELD, + max_results=None, + ): + super(GRPCIterator, self).__init__( + client, item_to_value, max_results=max_results + ) + self._method = method + self._request = request + self._items_field = items_field + self._request_token_field = request_token_field + self._response_token_field = response_token_field + + def _next_page(self): + """Get the next page in the iterator. + + Returns: + Page: The next page in the iterator or :data:`None` if + there are no pages left. + """ + if not self._has_next_page(): + return None + + if self.next_page_token is not None: + setattr(self._request, self._request_token_field, self.next_page_token) + + response = self._method(self._request) + + self.next_page_token = getattr(response, self._response_token_field) + items = getattr(response, self._items_field) + page = Page(self, items, self.item_to_value) + + return page + + def _has_next_page(self): + """Determines whether or not there are more pages with results. + + Returns: + bool: Whether the iterator has more pages. + """ + if self.page_number == 0: + return True + + if self.max_results is not None: + if self.num_results >= self.max_results: + return False + + # Note: intentionally a falsy check instead of a None check. The RPC + # can return an empty string indicating no more pages. + return True if self.next_page_token else False diff --git a/venv/lib/python3.6/site-packages/google/api_core/path_template.py b/venv/lib/python3.6/site-packages/google/api_core/path_template.py new file mode 100644 index 0000000..bb54935 --- /dev/null +++ b/venv/lib/python3.6/site-packages/google/api_core/path_template.py @@ -0,0 +1,197 @@ +# Copyright 2017 Google LLC +# +# 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. + +"""Expand and validate URL path templates. + +This module provides the :func:`expand` and :func:`validate` functions for +interacting with Google-style URL `path templates`_ which are commonly used +in Google APIs for `resource names`_. + +.. _path templates: https://github.com/googleapis/googleapis/blob + /57e2d376ac7ef48681554204a3ba78a414f2c533/google/api/http.proto#L212 +.. _resource names: https://cloud.google.com/apis/design/resource_names +""" + +from __future__ import unicode_literals + +import functools +import re + +import six + +# Regular expression for extracting variable parts from a path template. +# The variables can be expressed as: +# +# - "*": a single-segment positional variable, for example: "books/*" +# - "**": a multi-segment positional variable, for example: "shelf/**/book/*" +# - "{name}": a single-segment wildcard named variable, for example +# "books/{name}" +# - "{name=*}: same as above. +# - "{name=**}": a multi-segment wildcard named variable, for example +# "shelf/{name=**}" +# - "{name=/path/*/**}": a multi-segment named variable with a sub-template. +_VARIABLE_RE = re.compile( + r""" + ( # Capture the entire variable expression + (?P\*\*?) # Match & capture * and ** positional variables. + | + # Match & capture named variables {name} + { + (?P[^/]+?) + # Optionally match and capture the named variable's template. + (?:=(?P